Python数据可视化基础(四)模拟掷骰子

前情提要

上篇提到随机漫步可模拟分子运动等现实情况,本篇介绍如何模拟一种常见的情景:掷骰子。

掷骰子
4.1 概述

在数学领域,掷骰子作为一种常见的数据分析模型而存在。在经济等相关领域,它是一种重要的博弈场景。甚至在童年游戏《大富翁》中,也有它的影子。

要模拟此类场景,我们将使用Plotly生成交互式图表进行数据分析。

4.2 Plotly的安装

类比第一篇中安装Matplotlib的操作,同样打开cmd,输入以下命令:

pip install plotly

此时cmd会自动安装Plotly,显示如下: 

 看到最后一行,我们知道此时Plotly已经准备就绪。

4.3 创建Die类

为模拟掷骰子这一情况,我们需要创造一个Die类。

from random import randint

class Die:
    """表示一个骰子的类"""
    #一个六面的骰子
    def __init__(self,num_sides=6):
        self.num_sides=num_sides
        
    #模拟滚动呐
    def roll(self):
        """返回一个合理的随机值"""
        return randint(1,self.num_sides)

 在设计这个类的时候,单个骰子唯一需要设置的属性是面数。六个面的骰子可简称D6,八个面的可称作D8。

接下来模拟滚动,骰子最终返回一个合理的值。

我们可以先测试一下以上这段代码是否能真的模拟一个骰子。

#创建一个骰子呐
die=Die()
#再来个列表记录一下结果咯
results=[]
#骰子,启动!
for num_roll in range(1,100):
    result=die.roll()
    results.append(result)
print(results)

运行后数据是可以正常显示的 。(此处仅截取部分)

4.4 分析数据

列表数据总量太大时,无法直观看出有效信息。这个时候需要对数据进行处理,其中最常见的是自动统计频数。此时我们可以书写一段代码自动打印各个情况的频数方便观察。

#看看咋个事儿
frequencies=[]
for value in range(1,die.num_sides+1):
    frequency=results.count(value)
    frequencies.append(frequency)
print(frequencies)

此时运行可得到一组较为均衡的数据,证实模拟掷骰子这件事的合理性。

4.5 绘制直方图

有了直观的频数列表,我们又可以考虑绘制一种常见的统计图——频率分布直方图。

#对结果可视化
from plotly.graph_objs import Bar,Layout
from plotly import offline
x_values=list(range(1,die.num_sides+1))
data=[Bar(x=x_values,y=frequencies)]
x_axis_config={'title':'results'}
y_axis_config={'title':'result_fre'}
my_layout=Layout(title='final results',xaxis=x_axis_config,yaxis=y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename='D6.html')

注:Plotly不能直接接受range的生成结果,故要用list进行生成数字列表。

类Bar()表示用于绘制条形图的数据集,需要分别存储x和y的列表。这个类必须放在方括号内,因为数据集可能包含多个元素。

类Layout返回一个指定图标布局和配置的对象,这里设置了图表名称,并传入了x轴和y轴的配置字典。

为生成图表,调用函数offline.plot(),除去传输两个已配置完毕的字典参数之外,还指定了保存的文件名。运行过后打开web浏览器标签页即可看见条形图,或在.py文件目录中可寻找到该图像文件。

运行如下:

图像其余属性可自行增添设置使其变得更美观,此处不再赘述。

到此为止,掷一个骰子一次的结果已经相当直观。

4.6 问题拓展

上述阐释了如何显示掷单个骰子,我们可进行问题拓展。

例如,同时掷两个相同面数的骰子?

例如,同时掷两个不同面数的骰子?

这些问题举一反三即可,留给朋友们自己思考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值