在前兩篇文章中,筆者主要介紹了matplotlib
繪製折線圖和散點圖的基本使用。
相信大家已經發現了用Python
實現可視化的便捷性。
在本篇中,筆者將使用Python
可視化軟件包Pygal
生成可伸縮的矢量圖形文件。
本篇,我們將分析擲骰子的結果。
如果擲出一個骰子,有相等的機會擲出從1到6的任何數字。
但是,當使用兩個骰子時,兩個骰子的點數和更可能是某些特定數字而不是其他數字。
我們將嘗試通過收集模擬擲骰子的數據來確定最可能出現的數字。
然後,我們將繪製大量擲骰結果,以確定哪些結果比其他結果更有可能。
安裝Pygal
pip install Pygal
對於python開發者而言,安裝第三方庫已不是什麼難事。筆者不在此處贅述。
要查看使用Pygal
可以進行什麼樣的可視化,可訪問圖表類型的庫:http://www.pygal.org//,單擊Documentation
,然後單擊Chart types
,每個示例都包含源代碼。
創建骰子類
創建一個模擬單個骰子滾動的類:
from random import randint
class Die():
"""模擬單個骰子"""
def roll(self):
""""隨機返回一個從1到6的值"""
return randint(1, 6)
創建一個Die類,用於創建骰子實例。
當然,這個類很簡單,也可以直接使用random類模擬單個骰子的結果。
模擬擲單個骰子
from die import Die
# 實例化一個骰子
die = Die()
# 模擬100次擲骰子,並將結果存放在列表中
results = []
for roll_num in range(100):
result = die.roll()
results.append(result)
print(results)
在第4行創建一個Die
的實例。
第8行,通過循環模擬100次擲骰子,並將每次的模擬結果添加到result
列表中。
將result
打印出來(每次結果都不同)。
[3, 3, 2, 4, 4, 5, 6, 1, 5, 3, 2, 4, 4, 3, 3, 6, 4, 5, 3, 2,
6, 3, 5, 5, 6, 2, 4, 2, 3, 5, 3, 4, 6, 2, 3, 2, 2, 6, 2, 5,
2, 4, 1, 4, 4, 4, 6, 5, 3, 4, 1, 5, 3, 3, 5, 3, 2, 4, 1, 4,
4, 5, 6, 4, 6, 6, 5, 1, 5, 3, 2, 1, 5, 2, 5, 5, 4, 3, 1, 5,
5, 5, 6, 3, 3, 3, 1, 5, 2, 4, 2, 6, 1, 4, 3, 1, 5, 1, 6, 6]
分析結果
我們通過統計每個數字出現次數來分析擲一個骰子的結果:
from die import Die
die = Die()
results = []
for roll_num in range(1000):
result = die.roll()
results.append(result)
# 分析結果
frequencies = []
for value in range(1, 7):
frequency = results.count(value)
frequencies.append(frequency)
print(frequencies)
第6行,因爲我們使用Pygal
來分析而不是打印結果,因此我們將循環次數增加到1000。
在第11行,創建一個frequencies
空列表用於存放各結果出現次數。
在第12行的for循環中,分別統計各結果出現次數並添加到frequencies
。
打印frequencies
:
[181, 172, 181, 151, 152, 163]
這個結果看起來是合理的:沒有一個頻率比其他任何頻率高得很多或低的很多。
接下來讓我們可視化這些結果。
繪製直方圖
通過列表frequencies
,我們可以製作結果的直方圖。
直方圖是顯示某些結果出現頻率的條形圖。
import pygal
from die import Die
die = Die()
results = []
for roll_num in range(1000):
result = die.roll()
results.append(result)
frequencies = []
for value in range(1, 7):
frequency = results.count(value)
frequencies.append(frequency)
# 結果可視化
hist = pygal.Bar()
hist.title = "擲1000次單個骰子的結果"
hist.x_labels = ['1', '2', '3', '4', '5', '6']
hist.x_title = "結果"
hist.y_title = "結果頻次"
hist.add('骰子', frequencies)
hist.render_to_file('die_visual.svg')
第17行,我們通過創建pygal.Bar()
的實例hist
來製作條形圖。
然後,我們設置hist
的title
屬性,使用擲骰子的可能結果作爲x
軸的標籤,併爲每個軸添加標題。
第24行,我們使用add()
在向圖表添加一系列值(向其傳遞要添加的一組值的標籤以及要在圖表上顯示的值列表)。
最後,我們將圖表呈現爲SVG文件,該文件需要帶有的文件名和擴展名.svg
。
查看svg
圖的最簡單方法是在Web瀏覽器中。
您會看到類似於下圖中的圖表。
可以注意到,Pygal
使圖表具有交互性:將光標懸停在圖表中的任何條形上,您將看到與之相關的數據。在同一圖表上繪製多個數據集時,此功能特別有用。
擲兩個骰子
擲兩個骰子會產生更大的數目,並且結果分配會有所不同。
讓我們修改代碼以創建兩個骰子,來模擬擲出一對骰子的結果。
每次擲這兩個骰子,我們將這兩個骰子的結果相加,並將結果存儲在result
中。
新建die_visual.py的副本dice_visual.py,並進行以下更改:
import pygal
from die import Die
# 創建兩個骰子實例
die1 = Die()
die2 = Die()
results = []
for roll_num in range(1000):
result = die1.roll() + die2.roll()
results.append(result)
frequencies = []
max_result = 6 + 6
for value in range(2, max_result + 1):
frequency = results.count(value)
frequencies.append(frequency)
hist = pygal.Bar()
hist.title = "兩個骰子擲1000次的結果"
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
hist.x_title = "結果"
hist.y_title = "結果頻次"
hist.add('骰子1 + 骰子2', frequencies)
hist.render_to_file('dice_visual.svg')
創建兩個Die
實例後,我們擲骰子,並計算兩個骰子結果的總和。
可能的最大結果12
是兩個骰子上最大數目的總和,我們將其存儲在max_result
中。
最小的結果2
是兩個骰子上最小數目的總和。
當我們分析結果時,我們會計算介於2和最大結果之間的每個值的結果的次數(當然,我們可以直接使用range(2, 13)
)。
創建圖表時,我們將修改x軸和數據的標題和標籤(如果x_labels
列表很長,可以根據規律編寫一個列表生成式)。
運行結果:
Pygal
對擲骰子結果建模的能力爲我們提供了探索這種現象的極大的自由度。
在短短几分鐘內,我們可以模擬大量擲骰子實驗。
總結
通過這三篇內容的瞭解,相信您基本掌握了
- 如何使用
matplotlib
創建簡單圖, - 瞭解瞭如何使用散點圖探索隨機遊走
- 如何使用
Pygal
創建直方圖 - 如何使用直方圖來探索不同大小的擲骰子的結果
用代碼生成自己的數據集是一種有趣且強大的建模和探索各種現實情況的方法。
當然,最重要的是學會如何高效的使用工具,希望我的文章對您有幫助。