一个小巧而有特色的Python矢量可视化库:pygal

pygal 是一个基于SVG的动态可视化Python库,该库枚举了各种常用不常用的图表类型,满足基本的可视化需求,可以画简单的地图。其特点是接口易用,有很多简化的写法,方便得绘制出统计图表,可以生成迷你图,有基本交互,不需要额外的语句,鼠标移动到图表上有文本标签强化效果。但图表不能直接渲染到notebook里,不能合并多个图,例如柱+折线形成复合图,因此使用范围还是比较有限。

绘图框架

一个很sexy的写法:

1
2
import pygal
pygal.Bar()(76,37,90,60,50)(37,46,53,81,60).render_in_browser()

链式写法,各种配置浓缩到一个语句里。

pygal基础绘制示例

为了更容易理解,一个个对象的赋值写法如下:

1
2
3
4
import pygal
bar= pygal.Bar() #初始化一个柱状图
bar.add('A', [76,37,90,60,50]) #给柱图添加数据
bar.render_to_file('bar_chart.svg') #渲染出图

也是新建对象后用add()添加数据的做法,和pyecharts等前端封装库的接口很相似。

基础统计图

除了柱状图的Bar()之外,其他类型的图有XY、Line、Pie、Box、Histogram等,挺常规。

在个性化配置方面,初始化bar对象时可设置颜色、设置标题、设置x轴,再加y轴数据,最后渲染出图。

细化的属性包括控制柱的形状,如获得圆角矩形柱。print_values控制是否显示图上的文本标签。

1
2
3
4
5
6
7
8
from pygal.style import Style
bar= pygal.Bar(style=Style(colors=['#1eafae','#ba5c25']), print_values=True, print_values_position='top')
bar.title = '柱状图01' #设置标题和x轴标签
bar.x_labels =['Mon.','Tue.','Wed.','Thu.','Fri.']
bar.add('Y',[76,37,90,60,50])
bar.add('Z',[37,46,53,81,60]) #簇状柱图

bar.render_in_browser()
1
2
3
4
bar= pygal.Bar(rounded_bars=20)  #控制柱的形状,圆角矩形柱
bar.x_labels =['Mon.','Tue.','Wed.','Thu.','Fri.']
bar.add('Y',[76,37,90,60,50])
bar.render_in_browser()

簇状柱图绘制效果

多个add是簇状柱图,会自动处理x轴上排列的细节,不需要手动配置。从柱状图变成堆叠柱状图用StackedBar,示例如下。

1
2
3
4
5
6
bar= pygal.StackedBar(style=Style(colors=['#1eafae','#ba5c25']),print_values=True)
bar.title = '堆叠柱状图'
bar.x_labels =['Mon.','Tue.','Wed.','Thu.','Fri.']
bar.add('Y',[76,37,90,60,50])
bar.add('Z',[37,46,53,81,60])
bar.render_in_browser()

堆叠柱状图绘制示例

XY表示散点图,其他库可能更喜欢用Scatter。Line绘制折线图,在初始化pygal.Line()时设置参数fill=True,则绘制的是填充的面积图。

1
2
3
4
5
6
chart= pygal.Line(interpolate='cubic',fill=True,style=Style(colors=['#1eafae','#ba5c25']),print_values=True,print_values_position='top')
chart.title = '平滑曲线图(填充)'
chart.x_labels =['Mon.','Tue.','Wed.','Thu.','Fri.']
chart.add('Y',[76,37,90,60,50])
chart.add('Z',[37,46,53,81,60])
chart.render_in_browser()

pygal绘制折线图

填充面积图示例

pygal绘制一些实用特色图表很方便,因为都封装好了,并且可调节的参数不少,这是该库的优势之一。

特色图表

通过Radar可以初始化一个雷达图。

1
2
3
4
5
6
7
rdr= pygal.Radar(style=Style(colors=['#1eafae','#ba5c25']),print_values=True,print_values_position='top')
rdr.title = '雷达图'
rdr.x_labels =['Mon.','Tue.','Wed.','Thu.','Fri.']
rdr.add('Y',[76,37,90,60,50])
rdr.add('Z',[37,46,53,81,60])

rdr.render_in_browser()

pygal绘制雷达图

在pygal源码中,Rader继承自Line,符合图形语法的理念, Line()则是直接继承Graph。

能快速绘制出仪表盘图的Python库并不多,仪表盘图在pygal里是SolidGauge,可以设置是半饼或360度的仪表盘范围,仪表盘是各种可视图表的规律排列,而仪表盘图在实际应用中可以形象地表示任务KPI的完成进度,和温度计图功能相似。

1
2
3
4
5
6
#仪表盘图
gauge = pygal.SolidGauge(half_pie=True, inner_radius=0.70,print_values=True)
gauge.title = '当前完成度'
gauge.value_formatter =lambda x: '{:.1f}%'.format(x)
gauge.add('cur',80)
gauge.render_in_browser()

仪表盘图绘制示例

Pyramid表示金字塔图,也称为蝴蝶图,可以方便地对比两组数据的分布结构。

1
2
3
4
5
6
7
#Pyramid
chart = pygal.Pyramid(style=Style(colors=['#1eafae','#ba5c25']))
chart.title = '金字塔图(Y和Z同组对比)'
chart.add('Y',[76,37,90,60,50])
chart.add('Z',[37,46,53,81,60])

chart.render_in_browser()

pygal绘制金字塔图

pygal绘制树状图使用Treemap,电脑磁盘文件的归属关系和文件大小比较可以形象地用树状图表示出来,输入的数据结构不需要很复杂,一些细节的调节和排列pygal都处理好了。

1
2
3
4
5
6
7
8
9
#Treemap
treemap = pygal.Treemap()
treemap.title = '树状图'
treemap.add('X', [9,7,81,40])
treemap.add('Y', [76,37,90,60,50])
treemap.add('Z', [37,46,53,81,60])
treemap.add('K', [52, 71])

treemap.render_in_browser()

树状图绘制示例

pygal还可以绘制分层设色的地图,但有依赖库,绘制地图需要额外安装三个库。
pygal_maps_world用于绘制全球各个国家投影地图,通过国家名称缩写索引到对应的国家,也可以索引到各大洲,可以对国家进行分层设色,是面状要素,没有点、线的个性化。

1
2
3
4
5
6
7
8
9
10
11
12
chart=pygal.maps.world.world.World(style=Style(colors=['#1eafae','#69ffff', '#ba5c25', '#ffa069', '#a3ffff','#d7ce88']))
chart.title = '分层设色地图 pygal'
chart.add('2020', {
'af': 14,
'cn': 100,
'in': 95,
'ir': 74,
'sa': 39,
'us': 49,
'pk': 1
})
chart.render_in_browser()

世界地图的地图图元用的是worldmap.svg。
pygal_maps_fr库用于法式地图,pygal_maps_ch绘制瑞士地图,具体使用时调用方式和上面的pygal_maps_world一致,都是可以根据缩写索引进行分层设色。

迷你图

pygal另外一大特色是单独支持生成数据的迷你图。对应的接口有.render_sparkline().render_sparktext()
迷你图作为添色,可以用于快速概览数据的大小对比。

1
2
3
chart = pygal.Line()
chart.add('Y',[76,37,90,60,50])
chart.render_sparktext()

pygal的特色之迷你图

在实际使用中,chart初始化可以不是Line ,写其他也行,但成图就是无间隔柱状图,还是Line。

总结

pygal在Python可视化库中是很有特色的,很好地平衡了基础的统计图表类型和几个特色图表,接口使用方便,对使用者友好,是一个小巧且性感的库,值得了解和使用。其优点有接口容易使用、轻量化、能方便地绘制带交互效果的仪表盘图、仪表盘图、金字塔图和简单地图,SVG方便前端使用,也方便编辑,能够和d3等可视化库协同。目前该库在Github上有2.3k的star,说明认可和使用pygal的人挺多的。

参考资料