这篇博客,我们将学习使用 python可视化包 Pygal 来生成矢量图形文件。针对于需要在尺寸不同的屏幕上显示的图表具有很大用处。因为它们可以自动缩放,以此来适合观看者的屏幕。
.
在这个项目中,我们将对掷骰子的结果进行分析。掷6面的常规骰子,所投掷结果的可能性相同。但如果同时投掷两个骰子,某些点数出现的可能性将比其他点数大。
为了确定哪些点数出现的可能性最大,我们生成一个表示投掷骰子结果的数据集,并根据结果绘制出一个图形。
安装 Pygal
win + R -> cmd 打开命令行窗口
然后录入命令:
python -m pip install --user pygal==1.7
OK 安装好了。继续往下进行…
Pygal 画廊
创建 Die 类
该类用于模拟掷一个骰子:
die.py
from random import randint
class Die():
#一个模拟投掷筛子的类
def __init__(self,num_sides=6):
#骰子默认只有6面
self.num_sides = num_sides
def roll(self):
#返回一个位于1和筛子面数之间的随机值
return randint(1,self.num_sides)
关于 Die 类的 init 方法
接收一个可选参数。创建该类实例时,如果没有指定任何参数,面数默认为6。反之,这个值将用于设置骰子的面数。骰子根据面数命名,例:6面命名为D6,8面命名为D8,以此类推。
关于 Die 类的 roll 方法
该方法使用函数 randint() 返回一个1和面数之间的随机数。这个函数可能返回起始值1、终止值num_sides或这两个值之间的任何整数。
掷骰子
在使用这个类来创建图表前,先来投掷D6筛子,将结果打印出来,并检查结果是否合理:
die_visual.py
from die import Die
#创建一个D6
die = Die()
#将所投掷的几次筛子的结果存储到列表中
results =[]
for roll_num in range(10):
result = die.roll()
results.append(result)
print(results)
所投掷骰子10次的结果:
分析结果
为分析投掷一个D6骰子的结果,我们计算每个点数出现的次数:
die_visual.py:
from die import Die
#创建一个D6
die = Die()
#将所投掷的几次筛子的结果存储到列表中
results =[]
for roll_num in range(1000):
result = die.roll()
results.append(result)
#分析结果
frequencies = []
for value in range(1,die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
print(frequencies)
分析结果:
为做这个分析:
由于是使用 pygal进行分析,而不是将结果打印出来,因此可以将模拟掷骰子的次数增加到1000。为了分析结果,创建了空列表 frequencies,用于存储每种点数出现的次数。
.
新的循环遍历可能的点数,所谓可能,也就是1~6 常规骰子的数字,计算每种点数在results中出现了多少次,并将这个值附加到列表frequencies的末尾。
如果结果是6个值,那就是合理的,因为骰子只有6个面,也只可能出现6次结果值。
下面我们在来可视化这些结果:
绘制直方图
#直方图是一种条形图,用其指出各种结果出现的频率。
die_visual.py
from die import Die
import pygal
#创建一个D6
die = Die()
#将所投掷的几次骰子的结果存储到列表中
results =[]
for roll_num in range(1000):
result = die.roll()
results.append(result)
#分析结果
frequencies = []
for value in range(1,die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
#print(frequencies)
#对结果进行可视化
hist = pygal.Bar()
hist.title = "Request of rolling one D6 1000 times."
hist.x_labels = ['1','2','3','4','5','6']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6',frequencies)
hist.render_to_file('die_visual.svg')
前面的代码还是上一小结的 demo。这里没有更改,只是把 print 语句注释掉了。因为有了直方图可以更直观的看到效果,所以注释了控制台中打印的内容。
.
然后导入了 pygael,并创建一个 pygal.Bar() 的实例。
在接下来的 设置标题,x和y坐标的标题就不说了,.render_to_file方法将绘制的直方图渲染为一个文件,并将其存储在项目文件所在的地方。
使用浏览器打开存储在本地 .svg文件,查看效果:
如果你在途中遇到这样的问题:
importError
import pygal报错ImportError: cannot import name ‘Iterable‘ from ‘collections‘
你可以通过编辑器报错的地方直接跳到 _compat.py 文件中。
然后找到所在行的 第二十行。
也就是:
from collections import Iterable
给其添加后缀,改为:
from collections.abc import Iterable
在然后保存测试即可。
同时投掷两个骰子
dice_visual.py
from die import Die
import pygal
#创建一个D6
die_1 = Die()
die_2 = Die()
#将所投掷的几次骰子的结果存储到列表中
results =[]
for roll_num in range(1000):
result = die_1.roll() + die_2.roll()
results.append(result)
#分析结果
frequencies = []
max_result = die_1.num_sides + die_2.num_sides
for value in range(2,max_result+1):
frequency = results.count(value)
frequencies.append(frequency)
#print(frequencies)
#对结果进行可视化
hist = pygal.Bar()
hist.title = "Request of rolling two D6 dice 1000 times."
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6 + D6',frequencies)
hist.render_to_file('die_visual.svg')
同时投掷两个面数不同的骰子
我们来创建一个 6面 和 一个 10面的骰子,看看同时投掷这两个骰子 50 000次的结果:
from die import Die
import pygal
#创建一个D6
die_1 = Die()
die_2 = Die(10)
#将所投掷的几次骰子的结果存储到列表中
results =[]
for roll_num in range(50000):
result = die_1.roll() + die_2.roll()
results.append(result)
#分析结果
frequencies = []
max_result = die_1.num_sides + die_2.num_sides
for value in range(2,max_result+1):
frequency = results.count(value)
frequencies.append(frequency)
#print(frequencies)
#对结果进行可视化
hist = pygal.Bar()
hist.title = "Request of rolling a D6 and a D10 50 dice 1000 times."
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6 + D10',frequencies)
hist.render_to_file('die_visual.svg')
查看程序执行结果: