企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 柱状图 ## 需求: 公司A业务分布四大板块:制造,外包,金融,咨询。其2018年纯收入分别是:3120,2056,5754,4632(万元)。绘制一个柱状图来实现数据展示。 ![](https://box.kancloud.cn/5dadcdaecd7d26c2d1233cd4d3a09304_794x550.png) 如图这是我在echarts上构建的图表,接下来我们分析d3如何实现。 ## 分析 拆分需要绘制哪些: 1. x轴为板块 2. y轴为收入值 3. 中心柱状图 4. y轴刻度的水平线 根据拆分,我们再次分析: 1. x轴的实现,数值是连续的,所以我们可以使用线性比例尺去实现计算。 2. y轴的实现,按顺序的,所以我们可以使用序数比例尺。 3. 中心的柱状图比较简单,通过比例尺计算出位置及长度。绘制rect 4. 通过修改y轴的line从而实现 再细化思路: 1. 首先构建一个svg,确定图表应该绘制的大小。 2. 分析数据哪个是y轴数据哪个是X轴数据, 3. 计算x,y轴的domain范围,可以使用d3.max,d3.min,d3.range等等 4. 构建比例尺。 5. 由于坐标轴需要留白,所以使用g标签通过transform进行移动。之后调用axis,绘制坐标轴。 6. 绘制柱状图,创建g标签通过transform进行移动,让其正好偏移至绘制区域。 7. 通过data绑定数据,之后创建rect后,其x,y,width,height属性通过比例尺进行计算。 ## 绘制 接下来我们开始绘制: ``` javascript //创建svg var svg = d3.select('#root') .append('svg') .attr('width', 600) .attr('height', 600) .style("background-color","#333"); var margin=[100,100,100,100] //模拟数据: var data = [['制造',3120],['外包',2056],['金融',5754],['咨询',4632]] //构建y轴的比例尺 var ymax = d3.max(data,function(d){return d[1]}) var y=d3.scaleLinear() .domain([0,ymax]).range([400,0]) var axisY = d3.axisLeft(y); var axisYG = svg.append('g') .attr('class','axisY') .attr('transform','translate(100,100)') .call(axisY); //构建x轴比例尺 var ydomain = data.map(function(d){return d[0]}) //['制造','外包','金融','咨询'] var x = d3.scaleBand() .domain(ydomain) .range([0,400]) .paddingInner(0.1) .paddingOuter(0.1) console.log(x.bandwidth(),x.step()) var axisX = d3.axisBottom(x) var axisXG = svg.append('g') .attr('class','axisY') .attr('transform','translate(100,500)') .call(axisX); //绘制bar var left = x.step() var bar = svg.append('g') .attr('transform','translate(100,100)') bar.selectAll('rect') .data(data) .enter() .append('rect') .attr('x',function(d){return x(d[0])}) .attr('y',function(d){return y(d[1])}) .attr('width',x.bandwidth()) .attr('height',function(d){return 400-y(d[1])}) ``` 关于[bar0](https://doter1995.github.io/d3-start-course/bar/bar-0.html) 8. *修改axis生成的比例尺,将刻度线line拉长,并设置为虚线样式。 ``` javascript axisYG.selectAll('g.tick') .selectAll('line') .attr('x1',-5) .attr('x2',400) .attr('stroke-dasharray','5, 5'); ``` ## 实例 美化后的[bar01](https://doter1995.github.io/d3-start-course/bar/bar-01.html) ![](https://box.kancloud.cn/181ec3cebd7cda6aca4d79444a1f1279_560x562.png)