小任务之使用SVG画柱状图~
function drawBar(data) {
var barGraph = document.querySelector("#bar-graph");
var graphWidth = 700;
var graphHeight = 300;
const graphPadding = 25;
//轴的宽高
const axisWidth = graphWidth - graphPadding;
const axisHeigt = graphHeight - graphPadding;
//柱的间隔
const barGap = 12;
//单个数据柱子的宽
const barWidth = ((axisWidth - graphPadding - barGap * 13) / 12) / data.length;
//每根柱子的颜色
const barColor = ["#27a1ea", "#9cdc82", "#ff9f69", "#d660a8", "#6370de", "#32d3eb", "#d4ec59", "#feb64d", "#b55cbd"];
//轴的颜色
const axisColor = "#000";
//最大值
var dataMax = 0;
//柱状图数据sale
var newData = []; //设置html的svg的宽度和高度
barGraph.setAttribute("width", graphWidth);
barGraph.setAttribute("height", graphHeight);
//找到最大值
for (let i = 0; i < data.length; i++) {
if (typeof data[0] != "number") {
let temp = Math.max(...data[i].sale);//es6扩展运算符 将数组转为序列。
if (temp > dataMax) {
dataMax = temp;
}
newData.push(data[i].sale);
} else {
dataMax = Math.max(...data);
newData.push(data[i]);
}
}
//数据和像素的折算
var rate = dataMax / (axisHeigt - graphPadding);
//绘制坐标轴
let barHtml = [];
//先纵轴再横轴注意SVG画线模板间隔
barHtml.push("<line x1=" + graphPadding + " y1=0" + " x2=" + graphPadding + " y2=" + axisHeigt + " stroke=" + axisColor + " stroke-width='2'/>");
barHtml.push("<line x1=" + graphPadding + " y1=" + axisHeigt + " x2=" + axisWidth + " y2=" + axisHeigt + " stroke=" + axisColor + " stroke-width='2'/>");
//绘制柱状图(需要X,Y,宽度,高度)(高度=数值/rate)
for (let i = 0; i < newData.length; i++) {
for (let j = 0; j < newData[i].length; j++) {
let num = parseInt(newData[i][j]);
let barBlock = data.length * barWidth; let x = graphPadding + (j + 1) * barGap + i * barWidth + j * barBlock;
barHtml.push("<rect width=" + barWidth + " height=" + (num / rate) + " x=" + x + " y=" + (axisHeigt - num / rate) + " fill=" + barColor[i] + " />");
}
}
barGraph.innerHTML = barHtml.join(""); //join("")拼成字符串无间隔 join()默认为逗号,
}
今天终于将SVG生成柱状图的代码给完成了,过程中定位比较重要,包括坐标轴的X,Y点,和长度宽度,都需要要好好设计一下。
其中viewbox属性比较有趣,学习了,贴出鑫旭大神的解说,非常清晰。http://www.zhangxinxu.com/wordpress/?p=4323
在编写代码时,记得哪个数组对应哪些数据,实在忘记可用console.log进行打印查看,方便定位
for循环中的i记得要声明!!
循环拼写html时,记得对应好SVG的标签格式,留出适当的空格才正确!
拼接最后的html时,用join(“”),中间不用放任何内容,便可连接html,不能使用join(),否则默认为逗号连接。
小任务之使用SVG画柱状图~的更多相关文章
- Chartist.js-同时画柱状图和折线图
最近几天都在研究chartist,因为echarts生成的图是位图,导成PDF的时候不够清晰.而chartist是搜到的免费插件中呼声较高的,基于SVG. 今天主要是想举一些代码例子给大家,介绍下如何 ...
- js canvas画柱状图 没什么高端的 就是一篇偶尔思路的
公司项目要用js画柱状图,本来想用个插件吧 chart.js 忽然一想 我们也用不了那么大的插件.自己写个吧,也能看看自己那点数学水平能够不! 有几个小亮点吧 1.函数x 和 函数y 对坐标进行了转化 ...
- python画柱状图并且输出到html文件
import matplotlibmatplotlib.use('Agg')import matplotlib.pyplot as pltfrom Cstring import StringIO y ...
- 教你用SVG画出一条龙
先看demo,九十七度 其实使用svg画出这条龙很简单,关键不在于怎么使用svg,而在于你的美术功底,哈哈. 好吧,当然基础是不能忽略的,先看下这条龙的代码: <svg id="lon ...
- Matlab实现画柱状图坐标标签旋转
引言: 在用matlab画柱状图或者其他图的时候,你是否碰到下图这种情况: 乍一看这个柱状图画的有馍有洋的,but,仔细一看你会发现,横坐标标签如果再长一点就不好看啦,甚至会重叠,就像这样: 这样的图 ...
- MATLAB 画柱状图(/直方图)修改横坐标名称并使其横着显示
使用MATLAB 画柱状图 ,即bar (x,y),其横坐标是默认 1.2.3.4.……的 % --v1 y1=[asum1,asum2,asum3,asum4,asum5,asum6,asum7,a ...
- Python 中 plt 画柱状图和折线图
1. 背景 Python在一些数据可视化的过程中需要使用 plt 函数画柱状图和折线图. 2. 导入 import matplotlib.pyplot as plt 3. 柱状图 array= np. ...
- svg画圆环
之前我已经分享了一篇css画圆环,为啥今天还要分享一篇svg画圆环呢? 原因是:css画圆环在部分ipone手机会有bug,最大张角为90°,所以圆环会有白色的间隙. 好了,开始代码展示: html: ...
- 利用Excel画柱状图,并且包含最大最小值
如何利用Excel画出如上样式的图? 1.绘制柱状图.如何绘制柱状图,操作非常简单,选中数据,点击合适的图表样式即可. 2.添加误差线.选中已绘制好的图,添加误差线.如果误差线没有出现,可以使用”更多 ...
随机推荐
- python3的enumerate函数
enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中.
- Vue项目 注释模板
此内容只适用于vscode 1.打开项目->按快捷键->ctrl+shift+p 2.选择红线选中的内容 ,如果是中文版看如下图片 如果是英文版看如下图 3.就开始进行配置 大家根据这张图 ...
- Laravel 视图调用model方法
首先控制器 model 视图
- Python用于http/https接口自动化
本接口自动化框架主要用到的类: 1. unittest:组织测试用例 2. requests:http/https请求 3. HTMLTestRunner:生成测试报告 4. Dingtalkchat ...
- iview 之 穿梭框 transfer
概述 双栏穿梭选择框,常用于将多个项目从一边移动到另一边. 说明 Transfer 组件主要基于以下四个 API 来使用: :data:总体数据,数组,每项为一个对象,且必须含有 key 值,组件基于 ...
- EC2 Instance扩容EBS卷容量
EC2实例运行一段时间后,由于日志和一些应用程序数据的积累,可能出现之前预留的磁盘容量不够需要扩容的情况.AWS EBS目前还不支持在线扩容,不过可以通过结合snapshot来实现. 如,我的EC2 ...
- Oracle 数据库、表、方案的逻辑备份与恢复
数据库(表)的逻辑备份与恢复 逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程,逻辑恢复是指当数据库对象被破坏而使用工具import利用备份的文件把数据对象导入到数据库的过程,逻 ...
- sencha touch textarea 手机上不显示滚动条,且不能滚动
最近在项目中发现 sencha touch 中的 textarea 在手机上不显示滚动条,也不能滚动. 在浏览器中之所以能显示滚动条滚动,那是浏览器为 textarea 添加的滚动条. 但在手机中是不 ...
- Ubuntu系统下安装并配置hive-2.1.0
说在前面的话 默认情况下,Hive元数据保存在内嵌的Derby数据库中,只能允许一个会话连接,只适合简单的测试.实际生产环境中不使用,为了支持多用户会话, 则需要一个独立的元数据库,使用MySQL作为 ...
- 运行时用AnimatorOverrideController动态加载动画片段
https://blog.csdn.net/tlrainty/article/details/54602786 项目中经常会遇到这种情况:很多模型动画的AnimatorController是一模一样的 ...