❝本文完整代码及数据已上传至
Github
仓库https://github.com/CNFeffery/FefferyViz ❞
1 简介
最近几个月一是工作繁忙,二是将业余的注意力多数放在Dash
系列教程的撰写上,因此费老师我已经很久很久很久没有更新过「在模仿中精进数据可视化」系列文章了?,今天继续第9期~
我们今天要绘制的数据可视化作品,灵感来源于DT财经某篇文章的一幅插图,原图如下:
图1
这幅图其实可以说是柱状蝴蝶图的一种变种,用极坐标系代替平面坐标系,左上和右下彼此分离相对的半圆均以逆时针方向对数据排行进行带色彩映射的可视化,非常的美观,容易给人留下深刻的印象。
而今天的文章我们换个数据源,基于近3个月「股票型」以及「债券型」基金各自涨幅的前十名数据(数据来源东方财富网),来基于matplotlib
使用同样的方式进行表达。
2 复刻过程
2.1 拆解主要视觉元素
其实这幅作品绘制起来主要的难度在于极坐标系下很多matplotlib
涉及到的API
都比较冷门,如果是对matplotlib
不太熟悉的朋友可能会感觉无从下手。
按照惯例,我们先来拆解一下这幅图的主要构图元素:
- 「分离的两部分半圆区域」
这幅作品中的主体区域当数左上及右下区域对应的两个半圆,它们之间是存在一定宽度的间隔,因此我们需要创建两个极坐标系子图,并调整位置,形成彼此相对的样子,我们可以先使用plt.subplots()
开辟画布,再针对画布对应Figure
对象执行add_axes()
方法调整位置,插入polar=True
的极坐标子图。
再配合set_xlim()
、set_ylim()
,以及极坐标系子图专有的set_thetagrids()
、set_rgrids
和set_theta_offset()
来完成限定圆形显示的角度范围、半径范围,自定义网格线以及修改旋转角度等作用,这一步后形成图2:
图2
- 「利用fill_between()来映射数据」
接下来我们就需要将数据映射到极坐标系中,可以选择「柱状图」或「面积填充」的方式进行绘制,我这里为了操作自由度更高,选择配合fill_between()
来基于面积填充进行映射(调色盘方案基于palettable
),因为是极坐标系,所以对应传入的参数变成了角度范围和半径序列,配合一些额外线条和白色填充后,效果如下:
图3
- 「文字标注」
因为我们的基金数据中,基金的名称普遍较长,且我还希望标注出每个扇形区域对应的涨幅数额,因此我使用环绕型的文字标注方式,基于matplotlib
的text()
方法,结合每个扇形区域的对应角度范围,在循环过程中推导出标注文字的旋转角度,这一步后得到的效果如下:
图4
这一步需要注意的是,matplotlib
中text()
在旋转时,其针对水平和竖直方向对齐方式,在极坐标系中有些要注意的地方,我在上图中设置了参数rotation_mode='anchor'
,它帮助我们「先旋转文字,再对齐」,如果不加这个参数,会「先对齐再旋转」,得到的效果会很混乱:
图5
2.2 完成复刻
在上述拆解的基础上,加上一些对细节的补充,便得到下面的作品:
图6
完整数据及代码你可以在文章开头的Github
仓库中对应找到。
以上就是本文的全部内容,欢迎在评论区与我进行交流讨论~
代码语言:javascript复制