Python Pygal常见数据图(折线图、柱状图、饼图、点图、仪表图和雷达图)详解

< 上一页Python Pygal Python读取csv文件下一页 >

Pygal 同样支持各种不同的数据图,比如饼图、折线图等。Pygal 的设计很好,不管是创建哪种数据图,Pygal 的创建方式基本是一样的,都是先创建对应的数据图对象,然后添加数据,最后对数据图进行配置。因此,使用 Pygal 生成数据图是比较简单的。

折线图

折线图与柱状图很像,它们只是表现数据的方式不同,柱状图使用条柱代表数据,而折线图则使用折线点来代表数据。因此,生成折线图的方式与生成柱状图的方式基本相同。

使用 pygal.Line 类来表示折线图,程序创建 pygal.Line 对象就是创建折线图。下面程序示范了利用折线图来展示两套教程销量统计数据的方法。
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 构造数据
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 创建pygal.Line对象(折线图)
line = pygal.Line()
# 添加两组代表折线的数据
line.add('C语言教程', y_data)
line.add('Python教程', y_data2)
# 设置X轴的刻度值
line.x_labels = x_data
# 重新设置Y轴的刻度值
line.y_labels = [20000, 40000, 60000, 80000, 100000]
line.title = '编程教程的历年销量'
# 设置X、Y轴的标题
line.x_title = '年份'
line.y_title = '销量'
# 设置将图例放在底部
line.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
line.render_to_file('fk_books.svg')
上面程序中的第 8 行代码创建了 pygal.Line 对象,该对象代表折线图。接下来程序调用 pygal.Line 对象的 add() 方法添加统计数据,然后对数据图进行配置。

运行上面程序,将会生成如图 1 所示的折线图。

折线图
图 1 折线图

水平柱状图和水平折线图

使用 pygal.HorizontalBar 类来表示水平柱状图。使用 pygal.HorizontalBar 生成水平柱状图的步骤与创建普通柱状图的步骤基本相同。下面程序示范了使用 pygal.HorizontalBar 生成水平柱状图来展示两套教程历年销量统计数据的方法:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 构造数据
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 创建pygal.HorizontalBar对象(水平柱状图)
horizontal_bar = pygal.HorizontalBar()
# 添加两组数据
horizontal_bar.add('C语言教程', y_data)
horizontal_bar.add('Python教程', y_data2)
# 设置Y轴(确实如此)的刻度值
horizontal_bar.x_labels = x_data
# 重新设置X轴(确实如此)的刻度值
horizontal_bar.y_labels = [20000, 40000, 60000, 80000, 100000]
horizontal_bar.title = '编程教程的历年销量'
# 设置X、Y轴的标题
horizontal_bar.x_title = '销量'
horizontal_bar.y_title = '年份'
# 设置将图例放在底部
horizontal_bar.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
horizontal_bar.render_to_file('fk_books.svg')
上面程序中第 8 行代码创建 pygal.HorizontalBar 对象作为水平柱状图,这与前面创建普通柱状图并无差别。在设置 pygal.HorizontalBar 对象时有一点需要注意,x_labels 属性用于设置 Y 轴的刻度值,而 y_labels 属性用于设置 X 轴的刻度值。

运行上面程序,将会生成如图 2 所示的水平柱状图。


图 2 水平柱状图

与水平柱状图类似的还有水平折线图,水平折线图使用 pygal.HorizontalLine 类来表示,水平折线图的 X 轴刻度值同样使用 y_labels 属性来设置,而 Y 轴刻度值才使用 x_labels 属性来设置。

例如如下程序所示:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 构造数据
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 创建pygal.HorizontalLine对象(水平折线图)
horizontal_line = pygal.HorizontalLine()
# 添加两组代表折线的数据
horizontal_line.add('C语言教程', y_data)
horizontal_line.add('Python教程', y_data2)
# 设置Y轴(确实如此)的刻度值
horizontal_line.x_labels = x_data
# 重新设置X轴(确实如此)的刻度值
horizontal_line.y_labels = [20000, 40000, 60000, 80000, 100000]
horizontal_line.title = '编程教程的历年销量'
# 设置X、Y轴的标题
horizontal_line.x_title = '销量'
horizontal_line.y_title = '年份'
# 设置将图例放在底部
horizontal_line.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
horizontal_line.render_to_file('fk_books.svg')

叠加柱状图和叠加折线图

有些时候,客户重点关心的不是两个产品在同一年的销量对比(应该使用普通柱状图),而是两个产品的累计销量,此时应该使用叠加柱状图或叠加折线图。

对于叠加柱状图而言,代表第二组数据的条性会叠加在代表第一组数据的条柱上,这样可以更方便地看到两组数据的累加结果。叠加柱状图使用 pygal.StackedBar 类来表示,程序使用 pygal.StackedBar 创建叠加柱状图的步骤与创建普通柱状图的步骤基本相同。

下面程序示范了使用 pygal.StackedBar 创建叠加柱状图来展示两种图书销量数据汇总的方法:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 构造数据
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 创建pygal.StackedBar对象(叠加柱状图)
stacked_bar = pygal.StackedBar()
# 添加两组数据
stacked_bar.add('C语言教程', y_data)
stacked_bar.add('Python教程', y_data2)
# 设置X轴的刻度值
stacked_bar.x_labels = x_data
# 重新设置Y轴的刻度值
stacked_bar.y_labels = [20000, 40000, 60000, 80000, 100000]
stacked_bar.title = '编程教程的历年销量'
# 设置X、Y轴的标题
stacked_bar.x_title = '销量'
stacked_bar.y_title = '年份'
# 设置将图例放在底部
stacked_bar.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
stacked_bar.render_to_file('fk_books.svg')
上面程序中,第 8 行代码创建了 pygal.StackedBar 对象,该对象就代表一个叠加柱状图。接下来程序同样先为叠加柱状图添加数据,然后配置叠加柱状图。

运行上面程序,将会生成如图 3 所示的叠加柱状图。


图 3 叠加柱状图

从图 3 可以看到,代表第二组数据的条柱叠加在代表第一组数据的条柱上。

与叠加柱状图类似的还有叠加折线图,叠加折线图使用 pygal.StackedLine 类来表示,叠加折线图的第二组折线的数据点同样叠加在第一组折线的数据点上。

关于叠加折线图,可参考如下程序:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 构造数据
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 创建pygal.StackedBar对象(叠加折线图)
stacked_line = pygal.StackedLine()
# 添加两组数据
stacked_line.add('C语言教程', y_data)
stacked_line.add('Python教程', y_data2)
# 设置X轴的刻度值
stacked_line.x_labels = x_data
# 重新设置Y轴的刻度值
stacked_line.y_labels = [20000, 40000, 60000, 80000, 100000]
stacked_line.title = '编程教程的历年销量'
# 设置X、Y轴的标题
stacked_line.x_title = '销量'
stacked_line.y_title = '年份'
# 设置将图例放在底部
stacked_line.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
stacked_line.render_to_file('fk_books.svg')
对应的是, 如果客户需要让叠加柱状图和叠加折线图以水平方式显示,则 Pygal 提供了 pygal.HorizontalStackedBar 和 pygal.HorizontalStackedLine 类来生成水平叠加柱状图和水平叠加折线图。

饼图

Pygal 提供了 pygal.Pie 类来支持饼图,程序在创建 pygal.Pie 对象之后,同样需要调用 add() 方法来添加统计数据。

pygal.Pie 对象支持如下两个特有的属性:
  • inner_radius:设置饼图内圈的半径。通过设置该属性可实现环形数据图。
  • half_pie:将该属性设置为True,可实现半圆的饼图。

下面程序示范了使用饼图来展示 2018 年 8 月编程语言的统计数据:
import pygal

# 准备数据
data = [0.16881, 0.14966, 0.07471, 0.06992,
    0.04762, 0.03541, 0.02925, 0.02411, 0.02316, 0.01409, 0.36326]
# 准备标签
labels = ['Java', 'C', 'C++', 'Python',
    'Visual Basic .NET', 'C#', 'PHP', 'JavaScript',
    'SQL', 'Assembly langugage', '其他']
# 创建pygal.Pie对象(饼图)
pie = pygal.Pie()
# 采用循环为饼图添加数据
for i, per in enumerate(data):
    pie.add(labels[i], per)
pie.title = '2018年8月编程语言'
# 设置将图例放在底部
pie.legend_at_bottom = True
# 设置内圈的半径长度
pie.inner_radius = 0.4
# 创建半圆数据图
pie.half_pie = True
# 指定将数据图输出到SVG文件中
pie.render_to_file('language_percent.svg')
上面程序中,第 11 行代码创建了一个 pygal.Pie 对象,该对象就表示一个饼图。接下来程序使用循环为饼图添加了数据。程序中第 19 行代码设置 pygal.Pie 的 inner_radius 半径为 0.4,这表明将该饼图设为空心环;第 21 行代码设置 pygal.Pie 的 half_pie 为 True,这表明将该饼图设为半圆。

如果将上面程序中第 19、21 两行代码注释掉,运行该程序,将会生成如图 4 所示的传统饼图。


图 4 传统饼图图

如果取消这两行代码的注释,程序将会生成空心的半圆饼图,如图 5 所示。


图 5 空心的半圆饼图

点图

与柱状图使用条柱高度来代表数值的大小不同,点图使用点(圆)的大小来表示数值的大小。Pygal 使用 pygal.Dot 类表示点图,创建点图的方式与创建柱状图的方式基本相同。

下面程序示范了使用点图来展示图书销量的统计数据:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 构造数据
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 创建pygal.Dot对象(点图)
dot = pygal.Dot()
dot.dots_size = 5
# 添加两组数据
dot.add('C语言教程', y_data)
dot.add('Python教程', y_data2)
# 设置X轴的刻度值
dot.x_labels = x_data
# 重新设置Y轴的刻度值
dot.y_labels = ['C语言教程', 'Python教程']
# 设置Y轴刻度值的旋转角度
dot.y_label_rotation = 45
dot.title = '编程教程的历年销量'
# 设置X轴的标题
dot.x_title = '年份'
# 设置将图例放在底部
dot.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
dot.render_to_file('fk_books.svg')
上面程序中,第 8 行代码创建了 pygal.Dot 对象,该对象代表点图。在创建了 pygal.Dot 对象之后,程序为该对象添加要展示的数据,然后配置该点图。

运行该程序,将会生成如图 6 所示的点图。


图 6 点图

仪表(Gauge)图

仪表图类似于一个仪表盘,在仪表盘内使用不同的指针代表不同的数据。Pygal 使用 pygal.Gauge 类表示仪表图。程序在创建 pygal.Gauge 对象之后,为 pygal.Gauge 对象添加数据的方式与为 pygal.Pie 对象添加数据的方式相似。

pygal.Gauge 对象有一个特别的属性:range,该属性用于指定仪表图的最小值和最大值。

下面程序示范了使用仪表图来展示各编程语言所占的市场比例:
import pygal

# 准备数据
data = [0.16881, 0.14966, 0.07471, 0.06992,
    0.04762, 0.03541, 0.02925, 0.02411, 0.02316, 0.01409, 0.36326]
# 准备标签
labels = ['Java', 'C', 'C++', 'Python',
    'Visual Basic .NET', 'C#', 'PHP', 'JavaScript',
    'SQL', 'Assembly langugage', '其他']
# 创建pygal.Gauge对象(仪表图)
gauge = pygal.Gauge()
gauge.range = [0, 1]
# 采用循环为仪表图添加数据
for i, per in enumerate(data):
    gauge.add(labels[i], per)
gauge.title = '2018年8月编程语言'
# 设置将图例放在底部
gauge.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
gauge.render_to_file('language_percent.svg')
上面程序中第 11 行代码创建了 pygal.Gauge 对象,接下来第 12 行代码对该对象的 range 属性赋值,将该仪表图的最大值赋值为 1,最小值赋值为 0。

运行该程序,将会生成如图 7 所示的仪表图。


图 7 仪表图

雷达图

雷达图适合用于分析各对象在不同维度的优势和劣势,通过雷达图可对比每个对象在不同维度的得分。假如我们从表 8 所示的 5 个方面(平台健壮性、语法易用性、社区活跃度、市场份额和未来趋势)的得分来评价各编程语言的优势。

表 8 编程语言对比
  平台健壮性 语法易用性 社区活跃度 市场份额 未来趋势
Java 5 4.0 5 5 5
C 4.8 2.8 4.8 4.8 4.9
C++ 4.5 2.9 4.6 4.0 4.9
Python 4.0 4.8 4.9 4.0 5
C# 3.0 4.2 2.3 3.5 2
PHP 4.8 4.3 3.9 3.0 4.5

对于表 8 所示的对比数据,我们可以使用雷达图来展示各编程语言在不同维度的优势。
import pygal

# 准备数据
data = [[5, 4.0, 5, 5, 5],
    [4.8, 2.8, 4.8, 4.8, 4.9],
    [4.5, 2.9, 4.6, 4.0, 4.9],
    [4.0, 4.8, 4.9, 4.0, 5],
    [3.0, 4.2, 2.3, 3.5, 2],
    [4.8, 4.3, 3.9, 3.0, 4.5]]
# 准备标签
labels = ['Java', 'C', 'C++', 'Python',
    'C#', 'PHP']
# 创建pygal.Radar对象(雷达图)
rader = pygal.Radar()
# 采用循环为雷达图添加数据
for i, per in enumerate(labels):
    rader.add(labels[i], data[i])
rader.x_labels = ['平台健壮性', '语法易用性', '社区活跃度',
    '市场份额', '未来趋势']
rader.title = '编程语言对比图'
# 控制各数据点的大小
rader.dots_size = 8
# 设置将图例放在底部
rader.legend_at_bottom = True
# 指定将数据图输出到SVG文件中
rader.render_to_file('language_compare.svg')
上面程序中第 14 行代码创建了 pygal.Rader 对象,接下来程序使用循环为雷达图添加数据。在雷达图上会显示各编程语言在不同维度的得分点,程序中第 22 行代码设置了得分点的大小。

运行该程序,将会生成如图 9 所示的雷达图。


图 9 雷达图
< 上一页Python Pygal Python读取csv文件下一页 >