程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python數據可視化-----生成數據二

編輯:Python

使用Plotly模擬擲骰子:

安裝Plotly:

在終端輸入pip install plotly直接進行安裝

要想模擬擲骰子,我們就必須先創建一個關於骰子的類。

創建Die類:

language_survey.py

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)#返回一個1-6范圍內的隨機數

擲骰子:

代碼如下:

project1.py

from language_survey import Die#導入我們在另一個文件中所寫的關於骰子的類
die=Die()#使用實例調用
results=[]#將產生的不同結果存儲在一個列表中
for roll_num in range(100):
result=die.roll()
results.append(result)
print(results)
[6, 6, 3, 5, 6, 3, 3, 3, 4, 6, 6, 5, 3, 5, 5, 6, 2, 3, 6, 4, 4, 6, 5,
5, 3, 6, 3, 3, 2, 3, 5, 4, 6, 2, 5, 3, 4, 1, 5, 3, 4, 6, 6, 4, 4, 2,
4, 2, 5, 4, 4, 1, 3, 5, 1, 3, 5, 2, 4, 5, 6, 1, 1, 4, 4, 6, 5, 3, 6,
5, 6, 5, 3, 1, 6, 4, 1, 5, 6, 1, 1, 3, 5, 6, 3, 4, 5, 4, 2, 5, 6, 4,
1, 5, 1, 1, 6, 2, 6, 2]

輸出結果似乎是沒有問題的,輸出的數字范圍都在0-6之間。

如果我們想記錄投擲N次之後,某個點出現的次數而不需要具體的結果呢?
,很簡單,我們可以通過再創建一個空列表用於存放投擲的某個點出現的次數。

對上述實例增加如下代碼:

frequencies=[]
for value in range(1,die.num_sides+1):
frequency=results.count(value)
frequencies.append(frequency)
print(frequencies)
[15, 10, 23, 12, 17, 23]

繪制直方圖:

直方圖是一種條形圖,指出了各種結果出現的頻率,創建這種直方圖的代碼如下:

#對結果進行可視化
x_values=list(range(1,die.num_sides+1))#將可能出現的點數存儲在名為x_values的列表中
#注:Plotly不能直接接受函數range()的結果,因此需要使用函數list將其轉換為列表
data=[Bar(x=x_values,y=frequencies)]#Bar()表示用於繪制條形圖的數據集,需要一個存儲x值得列表和一個存儲y值的列表
#注:Plotly類必須放在方括號內,因為數據集可能包括多個元素
#對橫軸和縱軸設置標簽
x_axis_config={
'title':'結果'}
y_axis_cofig={
'title':"結果的頻率"}
#類Layout()對圖表的布局和標題進行設置
my_layout=Layout(title="擲一個六面的骰子1000次的結果:",xaxis=x_axis_config,yaxis=y_axis_cofig)
#調用offline.plot()的作用為了生成圖表
#offline.plot()函數需要一個包含數據和布局對象的字典,並且還需要傳入一個文件名,此後會將該圖表放入該文件中
offline.plot({
'data':data,'layout':my_layout},filename='d6.html')
print(frequencies)

運行程序後:

輸出端結果:

[10, 20, 15, 17, 20, 18]

自動跳轉至浏覽器,呈現如下圖所示的直方圖:
注意,Plotly使該圖表具有交互性,該交互性體現在我們將鼠標指向其中的任意條形,就能看到與之相關聯的數據。
還有不要忽視了左上角的這些圖標,它也有許多實際性的作用,比如可以幫助我們縮放平移和保存圖像。

同時擲兩個面數相同的骰子:

前面我們學習了投擲一個骰子就需要創建與其相關的類,現在我們也需要給第二個骰子創建屬於它的類,每次投擲時都將兩個骰子的點數進行相加,並將其存儲在results中。

其需要修改的代碼如下:

---snip---
die_2=Die()#創建屬於第二個骰子的類
results=[]
for roll_num in range(100):
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)
x_values=list(range(2,max_result+1))
data=[Bar(x=x_values,y=frequencies)]
x_axis_config={
'title':'結果',"dtick":1}#ditick的作用:指定x軸顯示的刻度間距
y_axis_cofig={
'title':"結果的頻率"}
my_layout=Layout(title="擲一個六面的骰子100次的結果:",xaxis=x_axis_config,yaxis=y_axis_cofig)
offline.plot({
'data':data,'layout':my_layout},filename='d6_d6.html')
print(frequencies)

運行之後結果為:

輸出端結果:

[7, 3, 8, 11, 9, 16, 17, 14, 6, 5, 4]

自動跳轉至浏覽器,呈現如下圖所示的直方圖:

同時投擲兩個面數不同的骰子:

只需要在創建新的類的時候傳遞參數為10,將默認值6覆蓋,然後將骰子投擲的次數范圍改變。

代碼如下:

from plotly.graph_objs import Bar,Layout
from plotly import offline
from language_survey import Die
die_1=Die()
die_2=Die(10)#創建10面的骰子
results=[]
for roll_num in range(50_000):#改變投擲次數
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)
x_values=list(range(2,max_result+1))
data=[Bar(x=x_values,y=frequencies)]
x_axis_config={
'title':'結果',"dtick":1}
y_axis_cofig={
'title':"結果的頻率"}
my_layout=Layout(title="擲一個六面和十面的骰子50_000次的結果:",xaxis=x_axis_config,yaxis=y_axis_cofig)
offline.plot({
'data':data,'layout':my_layout},filename='d6_d10.html')
print(frequencies)

運行之後結果為:

輸出端結果:

[816, 1676, 2568, 3351, 4217, 5061, 4977, 5041, 4870, 5043, 4167, 3309, 2432, 1671, 801]

自動跳轉至浏覽器,呈現如下圖所示的直方圖:


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved