上篇文章是使用matplotlib来实现折线图和散点图的绘制,今天就来使用Pygal实现直方图(条形图)的绘制,如果看了上篇文章再来看这篇,我觉得效果会更加。哈哈,希望对你有所帮助!
上篇文章链接:基于matplotlib的折线图和散点图的绘制
1. 安装Pygal
Pygal是一个可视化包,它的优点在于可以生成可缩放的矢量图形文件,生成的图片一般是svg格式的。之所以说是矢量图,就是因为它能在不同尺寸的屏幕上能够自动缩放,以适应观看的屏幕,达到更好的美观效果。下面来说说Pygal的安装
windows上安装Pygal(Dos窗口)
python -m pip install pygal==2.4
Linux上安装Pygal
pip install pygal==2.4
可以去安装列表查看是否成功安装相应的版本,如下
pip list
2. 直方图绘制
2.1 构造数据
要画图就得有数据,下面来模拟一下掷一个6面的骰子所得的数据
#构造数据
from random import randint
class Die():
'''随机返回骰子的一个数'''
def __init__(self, D=6):
self.D = D
def roll(self):
'''随机返回1到6之间的一个数'''
return randint(1,self.D)
die = Die()
results = []
for i in range(100):
result = die.roll()
results.append(result)
上面是模拟掷了100次骰子,看看效果
由于直方图一般是用来直观的显示统计数据的,所以这里对上面1到6出现的数据进行一下统计,如下
count_one_number = []
for i in range(1,7):
'''统计每个数出现的次数'''
count_one_number.append(results.count(i))
print(count_one_number)
print(sum(count_one_number))
2.2 绘制直方图
有了上面的数据就可以绘图了,如下
#绘图
import pygal
hist = pygal.Bar()#实例化
#设置坐标轴
hist.title = "Roll of D6 100 times"
hist.x_labels = ['1','2','3','4','5','6']
hist.x_title = "Result"
hist.y_title = "Count numbers"
#传参绘图
hist.add('D6', count_one_number)
hist.render_to_file('D6.svg')
hist.add()函数的作用是向图表中添加一系列值,这里我们传了图的名称D6,以及绘图所需的数据count_one_number.hist.render_to_file()的作用是将图表保存名为D6的svg文件。用浏览器打开生成的“D6.svg”,将会看到下图
2.3 模拟掷两个骰子
下面来绘制一下同时掷两个骰子的直方图,代码如下
#绘制同时掷两个骰子的直方图
from random import randint
class Die():
"""返回掷两骰子的点数"""
def __init__(self,D_numbers):
self.D_numbers = D_numbers
def roll_1(self):
#返回第一个骰子的点数
return randint(1,self.D_numbers)
def roll_2(self):
#返回第二个骰子的点数
return randint(1,self.D_numbers)
"""记录10000次实验记录"""
die = Die(6)
results = []
for i in range(10000):
result = die.roll_1() + die.roll_2()
results.append(result)
"""统计results中每个数出现的次数"""
count_d = []
for value in range(2,13):
counts = results.count(value)
count_d.append(counts)
"""绘制统计图"""
import pygal
hist = pygal.Bar()
hist.title = "Results of two D6"
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12']
hist.x_title = "Result"
hist.y_title = "count nnumbers"
hist.add('D6+D6',count_d)
hist.render_to_file("two_D6_10000.svg")
效果如下