Python中的 matplotlib(三)使用Pygal模拟掷骰子
Python可视化包Pygal可生成可缩放的矢量图形文件,可在不同尺寸的屏幕上自动缩放,方便观看。
首先安装pygal,ubuntu终端执行pip install pygal,这里实测conda install pygal 无法安装
创建一个骰子的类
1 from random import randint 2 3 4 class Die(): 5 '''表示一个骰子的类''' 6 7 def __init__(self, num_sides=6): 8 # 骰子默认6面 9 self.num_sides = num_sides 10 11 def roll(self): 12 #返回一个位于1和骰子面数之间的值 13 return randint(1, self.num_sides)
掷1000次骰子,分析各点数出现次数并绘制直方图
import pygal from die import Die #创建一个6面骰子 die = Die() #掷几次骰子并将结果存储在列表中 results = [] for roll_num in range(1000): result =die.roll() results.append(result) #print(results) #分析结果:1000次中每个点数出现的次数 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('die_visual.svg')#将图表渲染成svg文件
Figure:
掷2个骰子,统计点数之和出现的次数
import pygal from die import Die #创建2个6面骰子 die_1 = Die() die_2 = Die() #掷几次骰子并将结果存储在列表中 results = [] for roll_num in range(1000): result =die_1.roll() + die_2.roll() results.append(result) #print(results) #分析结果:1000次中每个点数出现的次数 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 = "Results of rolling two D6 1000 times" hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] #or hist.x_labels = [str(x) for x in range(2, 13)] hist.x_title = "Result" hist.y_title = "Frequency of Result" hist.add('D6 + D6', frequencies)#将标签及结果添加到图表中 hist.render_to_file('dice_visual.svg')
Figure:
同时掷2个面不同的骰子50000次,一个6面,一个10面,点数之和相加,观测 次数
1 import pygal 2 from die import Die 3 4 5 #创建1个6面骰子和1个10面骰子 6 die_1 = Die() 7 die_2 = Die(10) 8 #掷几次骰子并将结果存储在列表中 9 results = [] 10 for roll_num in range(50000): 11 result =die_1.roll() + die_2.roll() 12 results.append(result) 13 14 #print(results) 15 #分析结果:50000次中每个点数出现的次数 16 frequencies = [] 17 max_result = die_1.num_sides + die_2.num_sides 18 for value in range(2, max_result + 1): 19 frequency = results.count(value) 20 frequencies.append(frequency) 21 #print(frequencies) 22 '''创建直方图,对结果进行可视化''' 23 hist = pygal.Bar()#创建直方图实例 24 #属性设置 25 hist.title = "Results of rolling a D6 and D10 50000 times" 26 #hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] 27 hist.x_labels = [str(x) for x in range(2, 17)] 28 hist.x_title = "Result" 29 hist.y_title = "Frequency of Result" 30 31 hist.add('D6 + D10', frequencies)#将标签及结果添加到图表中 32 hist.render_to_file('different_visual.svg')
Figure:
优美胜于丑陋(Python 以编写优美的代码为目标)//
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)//
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)//
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)//
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)//
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)//
可读性很重要(优美的代码是可读的)//
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)//
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)//
当存在多种可能,不要尝试去猜测‘而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)。虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )//
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)//
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)//
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)//