数据可视化_使用Plotly模拟掷骰子

作者:雷蕾
本次学习使用Python包plotly来生成交互式图表,plotly生成地图表是交互式的,用户将鼠标指向特定元素时,将突出显示有关元素的信息。
(一)要使用Plotly,首先得先安装plotly,可执行如下命令:
数据可视化_使用Plotly模拟掷骰子_第1张图片
(二)创建Die类
为了模拟掷一个有6面的骰子的情况,将创建一个Die类:

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,num_sides可用于指定骰子的面数;
类Die中还定义了另一个方法roll(),该方法使用函数randint()来返回一个位于1和骰子面数之间的随机数,这个函数可能是起始值1、终止值num_sides或者位于1和num_sides值之间的任何整数(1~6)。
(三)掷骰子
在使用Die类创建图表之前,我们先来掷骰子D6(拥有6面的骰子):

#掷骰子
from die import Die
#创建一个D6(骰子有6面)
die=Die()
#掷几次骰子并将结果存储在一个列表中
results=[]
for roll_num in range(100):
    result=die.roll()
    results.append(result)
print(results)


代码行die=Die()创建了Die实例,面数为默认值6;
代码行for roll_num in range(100)是掷骰子100次,并将结果存储在results中。
运行代码结果展示:

>>> 
==== RESTART: C:\Users\12184\Desktop\python_work\15_生成数据\die_visual - 副本.py ====
[6, 2, 4, 3, 4, 6, 3, 4, 2, 2, 2, 1, 1, 1, 2, 4, 2, 5, 2, 4, 5, 6, 5, 6, 6, 2, 2, 4, 3, 4, 6, 6, 1, 1, 4, 4, 3, 6, 4, 1, 1, 4, 2, 5, 6, 4, 5, 2, 5, 4, 1, 3, 3, 3, 6, 5, 4, 5, 1, 5, 4, 1, 1, 4, 2, 4, 1, 1, 2, 3, 6, 3, 5, 6, 1, 5, 4, 5, 6, 1, 3, 1, 5, 4, 2, 5, 3, 2, 6, 1, 3, 3, 3, 5, 2, 2, 1, 4, 3, 5]
>>> 

通过查看结果,见到的所有值都位于1~6,因此Die类没问题。
(四)分析结果
分析掷骰子(D6)的结果,计算每个点数出现的次数:

#掷骰子
#分析结果
from die import Die
#创建一个D6(骰子有6面)
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)

在示例中,我们创建空列表frequencies,用于存储每种点数出现的次数;
代码行for value in range (1,die.num_sides+1)是遍历可能的点数(1~6);
代码行 frequency=results.count(value)是计算每种点数(1~6)在results中出现的次数;
代码行frequencies.append(frequency)是将每种点数出现的次数附加到 frequencies列表的末尾。
运行代码结果展示:

>>> 
== RESTART: C:\Users\12184\Desktop\python_work\15_生成数据\die_visual - 副本 (2).py ==
[158, 162, 171, 176, 170, 163]
>>> 

(五)绘制直方图
有了频率列表可进行直方图的绘制(直方图可指出各种结果出现的频率):

from plotly.graph_objs import Bar,Layout
from plotly import offline
from die import Die
#创建一个D6(骰子有6面)
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)
#对结果进行可视化
x_values=list(range(1,die.num_sides+1))
data=[Bar(x=x_values,y=frequencies)]

x_xaxis_config={'title':'结果'}
y_yaxis_config={'title':'结果的频率'}
my_layout=Layout(title='掷一个6面骰子1000次的结果',xaxis=x_xaxis_config,yaxis=y_yaxis_config)
offline.plot({'data':data,'layout':my_layout},filename='d6.html')

代码行x_values=list(range(1,die.num_sides+1))是我们将可能出现的点数(1~6)存储在x_values列表中,plotly不能直接接受函数range()的结果,因此需要使用函数list()将其转换为列表;
代码行data=[Bar(x=x_values,y=frequencies)]中Plotly类Bar()表示用于绘制条形图的数据集,需要一个存储x值的列表和一个存储y值的列表。
类Layout()返回一个指定图标布局和配置的对象,这里设置了图表名称,并传入了x轴和y轴的配置字典;
代码行offline.plot({‘data’:data,‘layout’:my_layout},filename=‘d6.html’)中是为了生成图表,我们调用了函数offline(),这个函数需要一个包含数据和布局对象的字典,还接受了一个文件名,指定要将图表保存到哪里。
运行代码结果展示:
数据可视化_使用Plotly模拟掷骰子_第2张图片
需要指出一点:Plotly让图表具有交互性,当使用鼠标指向该图表中的任意条形,能看到与之相关联的数据。

你可能感兴趣的:(自学python,python)