D3.js画图:3D动态饼图(齿轮图)

JavaScript09

D3.js画图:3D动态饼图(齿轮图),第1张

通常画可视化图的工具很多,除了d3.js,还有echarts.js等。

通过比较,看起来ECharts.js更容易上手,但是因为我需要更灵活更符合个性定制化的工具,所以选了d3.js。

经过一段时间的磨炼,从折线图、闭合路径图、蜂窝图、直角坐标、极坐标都玩了个遍。

那这次就来个3D的吧,其实d3.js做3D的图不是很容易的,有更好的选择,但我认准了d3.js,一条道走到黑吧(想起高中数学老师说的话,当你解题解到一半时发现有更好的办法,不,赶紧忘掉,接着当前的方法,只要方法没错,总能解出来,也许会傻一点,但是一定会有正确的结果;如果中途放弃,也许另一个方法更快更聪明,但也许更慢或者错误,不算到最后,谁都不知道谁最准确。我选择相信他的话,于是。。。我成了程序员O(∩_∩)O哈哈~)。

有人鄙视拿来主义,要我说,你能拿来那是你的本事,如果还能在此基础上做出更好的东西,何乐而不为呢?

每个人时间有限,每个项目也有deadline,不可能从每一个螺丝钉怎么拧开始学起,不然怎么会有那么多五花八门的框架,会有封装好的组件和接口,正因为有人已经做了前期工作,所以时间才能省下来做更有意义的事情,这就是站在巨人肩上的道理所在吧。

但是我们得明白拿来的东西的原理,以及出了问题该怎么解决的能力。然后才能做出更厉害的东西。

首选当然是官网的例子咯,目测搜了一圈,终于找到一个3D Donut。就是你了,我的巨人。

把该地址的donut3d.js拷贝下来作为画3D饼图的基础js,待会会在此基础上修改,以满足我的要求(长的像齿轮的要求)。

那我们就一睹她的芳容吧。

如果这张图符合你的要求,那就打住,不用往下看了,直接看官网例子即可。

注意d3版本的问题,如果你用d3.v3.js,恭喜你,啥也不用改,直接拿来用;如果你用d3.v5.js,那稍微改下方法,比如d3.v5.js没有d3.layout,所以d3.layout.pie改成d3.pie。我就是那个不幸的人,用的d3.v5.js。没关系,改起来很快,运行下,看哪里有错,就改哪里,O(∩_∩)O哈哈~so easy!

还是先上个我已经改好之后的3D饼图(齿轮图)吧,方便说明。

其实显示的时候是个动态的,一节一节显示出齿轮的。

背景是黑乎乎的,据说现在流行黑乎乎的背景,显得有科技感,技术也要赶时髦啊,我这么fashion的人,做出来的东西也要fashion啊O(∩_∩)O~

从以上分析可以看出,难啃的骨头在第4点。这个图断断续续花了3天时间才搞定,为啥是断断续续呢,因为还有其他工作要做嘛,你懂得。

那就按顺序一条一条实现,总有一天我们的愿望都能实现!

首先新建svg及设置宽高。

我是切分成了32个小齿轮(包含透明的),如果你想分的更细,可以分成40或50个,只要你觉得好看就行。

既然要分成32个小立体快,那数据也要切分成32个。

通过以上处理,把数据整合成可以生成齿轮的完整数据dataset。

如果不增加左侧面和右侧面,那调用donut3d.js的draw方法后,会生成什么样的图形呢?

请各位仔细看。

是不是有种被掏空的感觉?如果你觉得这样挺好看,那也行,打住吧,后面就不用再看了;如果你想补齐其他面,请耐心往下看。

经过观察和比较,增加左侧面和右侧面就能填满空虚的心啦啦啦~

这次要在donut3d.js这个巨人身上添砖加瓦咯。

然后再用新增加的两个方法画出左右侧面。

终于填满需要的每一面,看上去像个立体齿轮图了。

这个图是很久之前做的,当时花了很长时间调试,每一个面有4条边,定位2个点,再加上高度和内半径,就可以计算出4个点,然后就可以画出4条边,最后填充颜色,一个面就完成了。

最近整理文档时觉得有必要写出来,方便以后查阅和探讨,也告诉自己积累是一个长期过程,不急不躁,慢慢来,一步一步完成既定目标,总有一天你会走遍技术的每个角落。

现在我整理成vue组件,传一个百分比的参数,就可以显示3D齿轮图了,我的3D齿轮图也成巨人啦。

在Excel中插入饼图时有时会遇到这种情况,饼图中的一些数值具有较小的百分比,将其放到同一个饼图中难以看清这些数据,这时使用复合条饼图就可以提高小百分比的可读性。

复合饼图(或复合条饼图)可以从主饼图中提取部分数值,将其组合到旁边的另一个饼图(或堆积条形图)中。

例如下面的饼图显示了某杂志的读者职业分布情况,其中小百分比数据较为密集不易看清楚。

而改用复合条饼图就显得一目了然。

有时还需要强调饼图中的一组数值,这时就可以使用复合饼图或复合条饼图,如下例为某些产品在几个城市的销售情况,第二个表格为“广州”的销售数据。

用复合饼图可以突出显示“广州”的详细销售情况。

下面以上表为例介绍复合饼图的制作方法,复合条饼图的制作方法类似。

首先,为了制作复合饼图,需要将上表中的数据进行重新组合,将数值放到同一行或同一列中,如下图中底部的表格:

Excel 2003:

1.选择重新组合后表格中的某个单元格,如B9单元格,单击菜单“插入→图表”,在“图表向导”对话框中选择“饼图”,“子图表类型”选择“复合饼图”。

单击“完成”按钮。

2.删除右侧的图例,双击图表中的数据系列,弹出“数据系列格式”对话框,选择“数据标志”选项卡,勾选“类别名称”和“值”。

选择“选项”选项卡, 可以看到“分割系列”默认选择的是“位置”,表示表格最后的几个数值将被放到次饼图中,具体的数量通过调整“第二绘图区包含最后”右侧的数值来确定,本例中由于有4个数值(“广州”的4个销售数据)需在次饼图中显示,这里改为“4”。

另外,调整“第二绘图区的尺寸”来调整次饼图的大小,这里改为“70”,即次饼图的尺寸为主饼图的“70%”。

“分割系列”选项除“位置”外,还有其他几个选项,含义如下:

数值:图表中的数据系列数值小于指定数值时放到次饼图中。

百分比值:图表中的数据系列数值小于指定百分比时放到次饼图中。

自定义:可以将某个数据系列数值从主饼图中拖入到次饼图中,反之亦然。实际上,“分割系列”无论为上述哪个选项,都可以在两个饼图之间拖动某个数据系列数值,拖动后“分割系列”会自动被设置为“自定义”。

单击“确定”。

 

将图表中的“其他”修改为“广州”,方法如下:单击“其他,3645.17”,这时整个数据标志都被选中,再次单击“其他,3645.17”,单独选中该数据标志。将“其他”改为“广州”。

将光标定位到数值“3645.17”前按回车键让该数据标志显示为两行,并将其拖到到适当的位置。调整其他数据标志的位置和绘图区的大小,最后完成图表。

Excel 2007/2010:

下面以Excel 2010为例来进行说明,Excel 2007中的操作方法类似。

1.选择重新组合后表格中的某个单元格,如B9单元格,在功能区中选择“插入”选项卡,在“图表”组中单击“饼图→复合饼图”。

2.删除右侧的图例,双击图表中的数据系列,弹出“设置数据系列格式”对话框(在Excel 2007中需右击数据系列,然后在快捷菜单中选择“设置数据系列格式”),将“第二绘图区包含最后一个”右侧的数值改为“4”,调整第二绘图区的大小,然后关闭对话框。

当“系列分割依据”选择“自定义”时,可以将某个数据点任意放置到主饼图或次饼图中。方法是选择某个数据点,在“点属于”右侧的下拉列表中选择放置的位置。

3.在图表的数据系列中右击,选择“添加数据标签”。双击图表中添加的数据标签,弹出“设置数据标签格式”对话框,在“标签选项”中勾选“类别名称”,然后关闭对话框。

4.将图表中的“其他”数据标志改为“广州”,方法同上。

5.要进一步美化图表,可以在“图表工具-设计”选项卡中的“样式”组中选择某种样式,如本例选择“样式26”。

复合条饼图的制作方法。

可按照以下步骤进行。

1.打开数据表。

2.选中数据区,点击插入,其他图表,圆环图。

3.点击里面的圆环,也就是系列1月,点击设计,更改图表类型,弹出对话框,点击饼图,复合饼图,确定。

4.在饼图上右击,点击设置数据系列格式。

5、弹出对话框,把第二绘图区包含最后一个后的数据高到最大,系列绘制在次坐标轴。再调整第二绘图区大小,这是为了选取系列2方便。确定。点击系列2,更改为复合饼图。

6、在系列2饼图上右击,点击设置系列数据格式,弹出对话框,把第二绘图区包含最后一个后的数值调到最小,关闭。

7、选中系列1,右击,点击设置数据点格式。

8、弹出对话框,点击填充,无填充。

9、点击边框颜色,无线条。关闭。

10、删除系列线,图例。

11、调整好两个饼图的大小,添加上数据标签,标题。在一张图表中制作两个饼图制作完成。