径向条形图(Radial Bar Chart),就是把普通笛卡尔二维坐标系中的条形图转为极坐标系下展示,使用弧度来表示数值大小。
如下图所示,在本文中解析一个 ECharts Gallery 中的径向条形图实例,顺带学习 ECharts 中极坐标系、颜色渐变和自定义系列的用法。
附带说一下,有时候也把径向条形图叫做玉玦图。古人曾经云过:“满者为环,缺者玦”,玉环都知道是什么样子,缺一块的玉环叫玉玦,用玉玦来称呼径向条形图真的是挺形象。
基本结构
首先把基本结构如下,给 ECharts 准备一个 DOM 容器用来初始化实例,自定义一组数据 data
和配置项 option
,最后给实例 chart
设置 option
。
1 |
|
数据 data
提前进行了排序,排列出来的径向条形图更美观。
坐标系配置
这个实例中由于使用的是极坐标系
,所以需要专门配置,本节中需要用的配置项如下:
- https://echarts.apache.org/zh/option.html#polar
- https://echarts.apache.org/zh/option.html#angleAxis
- https://echarts.apache.org/zh/option.html#radiusAxis
- https://echarts.apache.org/zh/option.html#radiusAxis.axisLabel
- https://echarts.apache.org/zh/option.html#radiusAxis.axisLine
- https://echarts.apache.org/zh/option.html#radiusAxis.axisTick
- https://echarts.apache.org/zh/option.html#radiusAxis.splitLine
- https://echarts.apache.org/zh/option.html#radiusAxis.data
代码如下:
1 | let option = { |
大部分的配置都是一些细节样式上的调整,最关键的三项是 polor
、angleAxis
和 data
。设置 polor
属性后自动变为径向坐标系,并加了一个最小半径 10%
和最大半径 80%
。angleAxis
是角度轴的设置,min
和 max
指的是的是 0°
和 360°
代表的数值。在这里为了避免数值过小的数据显示不明显,同时不让数值过大的数据把圆环填满,故意把 min
和 max
从数据的大小极限
向外拓展了一段,形成一个比较美观的玉玦效果。radiusAxis
是径向轴的设置,radiusAxis.data
属性返回的是数据中的每一项的 name
,目的是显示张三李四这一系列的数据名。
条形图配置
系列中 bar 条形图配置的部分比较普通,本节中需要用的配置项如下:
- https://echarts.apache.org/zh/option.html#series-bar
- https://echarts.apache.org/zh/option.html#series-bar.itemStyle
- https://echarts.apache.org/zh/option.html#series-bar.emphasis
关于条形图部分的配置代码如下:
1 | let option = { |
颜色渐变
条形图的配置比较普通,但是上述代码中明显不普通的地方是 itemStyle.color
,这里的颜色使用的是渐变
。虽然在 ECharts 文档中并没有对这里的颜色能渐变进行说明,但是在其他的配置中找到了对渐变的描述:
1 | // 线性渐变,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比。 |
所以在玉玦图的代码中渐变的意思就是从[100%, 0%]
的右上角到[0%, 50%]
的左中位置的线性渐变,并在中间加了颜色停顿点
。
需要说明的是,ECharts 还有另一种渐变方式,大家用的非常多但是至今没有文档说明:echarts.graphic.LinearGradient
,使用方式如下:
1 | { |
其中前四个参数依次对应右、下、左、上四个方位,比如 0,0,0,1
代表从正上方往正下方渐变,0,1,1,0
代表从左下方往右上方渐变,颜色停止点的理解与上述配置式的颜色停止点相同。
自定义系列
在玉玦图中,还有一个非常重要需要理解的地方就是每条 bar 后面都跟着一个数字 value
,这里使用自定义系列
加上去的。自定义序列是 ECharts 为了方便开发者能够跳出固定配置项,按照自己的想法自由渲染图表而推出的一个配置。
本节中需要查看的配置项如下:
- https://www.echartsjs.com/zh/option.html#series-custom
- https://www.echartsjs.com/zh/option.html#series-custom.renderItem.arguments.params
- https://www.echartsjs.com/zh/option.html#series-custom.renderItem.arguments.api
- https://www.echartsjs.com/zh/option.html#series-custom.renderItem.arguments.api.value
- https://www.echartsjs.com/zh/option.html#series-custom.renderItem.arguments.api.coord
代码如下:
1 | series: [ |
自定义序列的 type
是 custom
,又给赋予了一个 polar
极坐标系和数据 data
,最关键的地方是 renderItem
(自定义渲染逻辑
)。
renderItem
函数有两个参数 params
和 api
,第一个 params
主要包含以下内容,基本上全是坐标系和数据的值。
1 | { |
第二个参数 api
,返回一些方法,这里只用到的两个:value
和 coord
。
1 | // value得到给定维度的数据值: |
所以在代码中,先用 value()
获取了当前 item 的数据值,再传给 coord()
计算得到了该点在极坐标系中的位置[x, y, radius, angle]
。
接下来在 return
时,返回了一个 text
类型。text
类型中的 origin
指定旋转、缩放和平移的基准点,在这个实例中中就是 x
和y
;position
指定平移多少距离,在这里使用 sin(angle)
和 cos(angle)
计算当前点的切线方向,将文字平移了 3px
;rotation
使用 angle
加上了 90°
,将文字延切线摆放。returns.style
中给文字设定了文本值
、xy 坐标
和其他的一些样式,完成了文本类型的返回。
全部代码
全部代码如下所示:
1 |
|