用 Pygal 模拟掷骰子

这篇博客,我们将学习使用 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')

查看程序执行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tianlei_/article/details/130568522