新闻中心
JS如何实现图表绘制_J*aScript结合Canvas或SVG绘制图表方法教程
J*aScript绘制图表主要采用Canvas和SVG。Canvas适合高性能、大量数据绘制,如动态柱状图;SVG则因支持DOM操作和事件交互,更适合可缩放、需用户交互的折线图等场景。

J*aScript 实现图表绘制主要依赖两种技术:Canvas 和 SVG。它们各有特点,适用于不同场景。下面详细介绍如何使用 J*aScript 结合 Canvas 或 SVG 来绘制常见图表,如柱状图、折线图等。
使用 Canvas 绘制图表
Canvas 是 HTML5 提供的位图画布,通过 J*aScript 操作绘图上下文(context)来绘制图形。它适合绘制大量数据点,性能较高,但不保留图形对象信息。
基本步骤:
- 在 HTML 中创建
- 用 J*aScript 获取 canvas 上下文(2d context)
- 使用 context 的绘图方法绘制图形
示例:绘制简单柱状图
<canvas id="myChart" width="400" height="300"></canvas>
<script>
const canvas = document.getElementById('myChart');
const ctx = canvas.getContext('2d');
const data = [30, 50, 80, 60, 90]; // 示例数据
const barWidth = 50;
const barSpacing = 20;
const maxHeight = canvas.height - 20;
const maxValue = Math.max(...data);
data.forEach((value, index) => {
const x = index * (barWidth + barSpacing) + 30;
const y = maxHeight - (value / maxValue) * (maxHeight - 40);
const height = (value / maxValue) * (maxHeight - 40);
// 绘制矩形柱子
ctx.fillStyle = '#4CAF50';
ctx.fillRect(x, y, barWidth, height);
// 添加数值标签
ctx.fillStyle = '#000';
ctx.font = '12px Arial';
ctx.fillText(value, x + barWidth / 2 - 8, y - 5);
});
</script>Canvas 优势在于绘制效率高,适合动态更新和动画效果,但缺点是每个图形不是独立 DOM 节点,难以绑定事件或单独操作某根柱子。
使用 SVG 绘制图表
SVG(可缩放矢量图形)基于 XML 标签,每个图形元素都是独立的 DOM 节点,支持事件监听、CSS 样式和响应式缩放,适合需要交互的图表。
基本结构:
Visla
AI视频生成器,快速轻松地将您的想法转化为视觉上令人惊叹的视频。
100
查看详情
- 在 HTML 中插入 svg> 标签,定义宽度和高度
- 使用 J*aScript 动态创建图形元素(如
, , )并添加到 SVG 中
示例:用 SVG 绘制折线图
<svg id="lineChart" width="400" height="300"></svg>
<script>
const svg = document.getElementById('lineChart');
const data = [20, 40, 25, 70, 60];
const padding = 40;
const width = 400 - 2 * padding;
const height = 300 - 2 * padding;
const xSte
p = width / (data.length - 1);
const maxValue = Math.max(...data);
// 绘制坐标轴线
const xAxis = document.createElementNS("http://www.w3.org/2000/svg", "line");
xAxis.setAttribute("x1", padding);
xAxis.setAttribute("y1", height + padding);
xAxis.setAttribute("x2", width + padding);
xAxis.setAttribute("y2", height + padding);
xAxis.setAttribute("stroke", "black");
svg.appendChild(xAxis);
// 绘制折线路径
let pathData = `M ${padding} ${height + padding - (data[0] / maxValue) * height}`;
for (let i = 1; i < data.length; i++) {
const x = padding + i * xStep;
const y = height + padding - (data[i] / maxValue) * height;
pathData += ` L ${x} ${y}`;
}
const line = document.createElementNS("http://www.w3.org/2000/svg", "path");
line.setAttribute("d", pathData);
line.setAttribute("fill", "none");
line.setAttribute("stroke", "#1E90FF");
line.setAttribute("stroke-width", 2);
svg.appendChild(line);
// 添加数据点圆圈
data.forEach((value, index) => {
const x = padding + index * xStep;
const y = height + padding - (value / maxValue) * height;
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
circle.setAttribute("cx", x);
circle.setAttribute("cy", y);
circle.setAttribute("r", 4);
circle.setAttribute("fill", "#FF4500");
// 添加鼠标悬停提示
circle.addEventListener('mouseover', () => {
tooltip.style.display = 'block';
tooltip.style.left = x + 10 + 'px';
tooltip.style.top = y - 20 + 'px';
tooltip.textContent = value;
});
svg.appendChild(circle);
});
// 提示框
const tooltip = document.createElement('div');
tooltip.style.position = 'absolute';
tooltip.style.background = '#333';
tooltip.style.color = '#fff';
tooltip.style.padding = '4px 8px';
tooltip.style.borderRadius = '4px';
tooltip.style.fontSize = '12px';
tooltip.style.display = 'none';
document.body.appendChild(tooltip);
document.addEventListener('mousemove', () => {
if (tooltip.style.display === 'block') {
tooltip.style.display = 'none';
}
});
</script>SVG 更适合需要交互、缩放或长期维护的图表项目。每个元素可绑定事件,便于实现点击、悬停等行为。
选择 Canvas 还是 SVG?
根据实际需求决定:
- 数据量大、频繁重绘(如实时监控)→ 推荐 Canvas
- 需要交互、可访问性、响应式设计 → 推荐 SVG
- 追求开发效率 → 可考虑 D3.js、Chart.js 等库
原生 JS 配合 Canvas 或 SVG 能完全控制图表细节,适合定制化需求强的项目。掌握这两种方式,就能灵活应对大多数前端图表开发任务。
基本上就这些。理解绘图原理后,扩展成饼图、面积图也不复杂,关键是把数据映射到坐标和图形属性上。
以上就是JS如何实现图表绘制_J*aScript结合Canvas或SVG绘制图表方法教程的详细内容,更多请关注其它相关文章!
# css
# 折线图
# 图中
# 更适合
# 绑定
# 柱状图
# 新和
# 数据处理
# 多个
# 如何实现
# 响应式设
# seo
# svg
# html5
# 前端
# js
# html
# java
# javascript
# js语法教程
# app
# 高新网站推广定做
# 谷歌seo培训toc
# 大兴区网站建设价格多少
# 滤料推广网站
# 益阳网站推广设计
# 淮南网站推广后台
# 海林网站建设优化排名
# 假发的营销推广
# 河南推广建网站
# 宜宾网站优化费用
# 移除
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
单射、满射与双射的关系 一文理清所有逻辑
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
京东单号查询入口_京东快递订单追踪入口
zookeeper 都有哪些功能?
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
抖音网页版平台入口 抖音网页版官网在线访问教程
Django表单验证失败时保留用户输入数据的最佳实践
CSS布局中意外空白:解决padding-top导致的顶部间距问题
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
Go语言中动态执行代码字符串的策略与实践
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
HTML空白字符处理机制:渲染、DOM与编码实践
创客贴用户入口官网登录 创客贴网页版电脑版系统
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案
qq音乐在线播放入口_qq音乐电脑版登录链接
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
steam官方入口大全 steam账号注册及操作指南
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
微信网页版官方快速登录入口 微信网页版网页版账号直达
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
从J*aScript对象中精确提取指定属性的教程
sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置
J*aScript中管理异步API调用:确保操作顺序与数据一致性
163邮箱官方主页登录 直达网易邮箱登录核心页面
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
Django表单提交验证失败后保持字段值不刷新
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
Shopware订单对象中获取产品自定义字段的正确方法
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法
Golang如何使用context实现超时取消_Golang context超时取消模式实践


2025-11-04
浏览次数:次
返回列表
p = width / (data.length - 1);
const maxValue = Math.max(...data);
// 绘制坐标轴线
const xAxis = document.createElementNS("http://www.w3.org/2000/svg", "line");
xAxis.setAttribute("x1", padding);
xAxis.setAttribute("y1", height + padding);
xAxis.setAttribute("x2", width + padding);
xAxis.setAttribute("y2", height + padding);
xAxis.setAttribute("stroke", "black");
svg.appendChild(xAxis);
// 绘制折线路径
let pathData = `M ${padding} ${height + padding - (data[0] / maxValue) * height}`;
for (let i = 1; i < data.length; i++) {
const x = padding + i * xStep;
const y = height + padding - (data[i] / maxValue) * height;
pathData += ` L ${x} ${y}`;
}
const line = document.createElementNS("http://www.w3.org/2000/svg", "path");
line.setAttribute("d", pathData);
line.setAttribute("fill", "none");
line.setAttribute("stroke", "#1E90FF");
line.setAttribute("stroke-width", 2);
svg.appendChild(line);
// 添加数据点圆圈
data.forEach((value, index) => {
const x = padding + index * xStep;
const y = height + padding - (value / maxValue) * height;
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
circle.setAttribute("cx", x);
circle.setAttribute("cy", y);
circle.setAttribute("r", 4);
circle.setAttribute("fill", "#FF4500");
// 添加鼠标悬停提示
circle.addEventListener('mouseover', () => {
tooltip.style.display = 'block';
tooltip.style.left = x + 10 + 'px';
tooltip.style.top = y - 20 + 'px';
tooltip.textContent = value;
});
svg.appendChild(circle);
});
// 提示框
const tooltip = document.createElement('div');
tooltip.style.position = 'absolute';
tooltip.style.background = '#333';
tooltip.style.color = '#fff';
tooltip.style.padding = '4px 8px';
tooltip.style.borderRadius = '4px';
tooltip.style.fontSize = '12px';
tooltip.style.display = 'none';
document.body.appendChild(tooltip);
document.addEventListener('mousemove', () => {
if (tooltip.style.display === 'block') {
tooltip.style.display = 'none';
}
});
</script>