使用Pygal
pygal是python的可视化包,只要用来生成可以生成可缩放的矢量图形文件,对于需要在尺寸不同的屏幕上显示的图表,它们将自动缩放,以适应观看者的屏幕。 如果你打算以在线方式使用图表,请考虑使用Pygal来生成它们,这样它们在任何设备上显示时都会很美观。 #矢量图放大不失真
(1)安装pygal包 Linux和OSX系统
pip install --user pygal
Windows系统
python -m pip install --user pygal
【注意】:你可能需要使用命令pip3 而不是pip ,如果这还是不管用,你可能需要删除标志–user 。 要了解使用Pygal可创建什么样的图表,请查看图表类型画廊:访问http://www.pygal.org/ ,单击Documentation,再单击Chart types。每个示例都包含源代码,让你知道这些图表是如何生成的。 (2)案例模拟 【案例需求】:使用Pygal模拟掷骰子。 【案例模拟】:掷6面的常规骰子时,可能出现的结果为1~6点,且出现每种结果的可能性相同。然而,如果同时掷两个骰子,某些点数出现的可能性将比其他点数大。为确定哪些点数出现的可能性最大,我们将生成一个表示掷骰子结果的数据集,并根据结果绘制出一个图形。 【案例实现】:
class Die():
"""表示一个骰子的类"""
def __init__(self, num_sides=6):
"""骰子默认为6面"""
self.num_sides = num_sides
def roll(self):
""""返回一个位于1和骰子面数之间的随机值"""
return randint(1, self.num_sides)
模拟掷骰子 情形一、掷一个6面的骰子,分析结果
def roll_die():
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 = "Results 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('single_roll.svg')
#注意:Pygal让这个图表具有交互性:如果你将鼠标指向该图表中的任何条形,将看到与之相关联的数据。
#问题:实际操作时,发现鼠标移到图片上没有显示数据。
#原因:Pygal版本太老,和目前所用的python版本不兼容,或者使用的浏览器版本太低
#解决:更新Pygal pip install --upgrade pygal
【small tips】: (1)创建条形图 【语法】:chart=pygal.Bar(style=**,x_label_rotation=角度,show_legend=False/True) 注意:chart是pygal的实例,Bar首字母必须大写;style为样式,x_label_rotation旋转角度(顺时针旋转);show_legend是否显示图例。 (2)svg 是一种可缩放的矢量图像图形文件格式,这种格式的文件具有边缘清晰、文件体积小、传输方便的特点,因此在网页设计中比较常用。 【结果展示】: 情形二、同时掷2个6面的骰子
def double_roll():
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)
hist = pygal.Bar()
hist.title = "Results 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('double_roll.svg')
【解析】:算法思路与掷一个骰子一致,只是以相同的算法,新建了两个骰子实例。 【结果展示】: 情形三、同时掷两个面数不同的骰子
def double_diff():
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)
hist = pygal.Bar()
hist.title = "Results of rolling a D6 and a D10 50,000 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('double_diff_roll.svg')
【解析】:算法思路与掷一个骰子一致,只是以相同的算法,新建了两个骰子实例。 【补充】: 先将展示3种生成hist.x_labels列表的方法: 法一、for循环生成
xs = []
for value in range(2, max_result + 1):
xs.append(value)
hist.x_labels = xs
法二、列表解析法
xs=[value for value in range(2,max_result+1)]
hist.x_labels = xs
法三、直接赋值
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']
实现hist.x_labels列表自动生成,可将方法推广至hist.y_labels以及其他列表的生成
==》python列表的生成都可以使用以上这三种方法
|