擲骰子,定義類from random import randint#定義die類class Die():#設置骰子的面數為6 def __init__(self,num_sides=6): self.num_sides=num_sides#方法 roll() 使用函數 randint() 來返回一個 1 和面數之間的隨機數 def roll(self): return randint(1,self.num_sides)
2.同時擲兩個骰子,生成並保存頻數分布圖
import pygal#從之前代碼中導入創建的類from die import Die# 創建兩個 D6 骰子die_1=Die()die_2=Die()# 擲骰子多次,並將結果存儲到列表results中results=[]#循環1000次,收集擲骰子的數值結果for roll_num in range(1000):result=die_1.roll()+die_2.roll() results.append(result)#生成列表frequencies,計算不同數值情況下骰子的頻次frequencies=[]max_result=die_1.num_sides+die_2.num_sides#計算 2 到 max_result 的各種點數出現的次數#原本可以使用 range(2, 13),但這隻適用於兩個 D6 骰子。# 模擬現實世界的情形時,最好編寫可輕鬆地模擬各種情形的代碼。for value in range(2,max_result+1): frequency=results.count(value) frequencies.append(frequency)#生成條形圖,讓數據可視化hist = pygal.Bar()hist.title = "Results 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('dice_visual.svg')
3.擲兩個面數不同的骰子
這裡只需要將2中的代碼進行簡單修改即可。
# 創建兩個 D6 骰子die_1=Die()die_2=Die()
修改為:
# 創建一個 D6 和一個 D10die_1=Die()die_2=Die(10)
另外這裡收集數據的次數增加,所以
#循環1000次,收集擲骰子的數值結果for roll_num in range(1000):result=die_1.roll()+die_2.roll() results.append(result)
修改為:
for roll_num in range(5000):result=die_1.roll()+die_2.roll() results.append(result)
其他內容保持不變,得到下圖:
4.繪製3D柱狀圖
#導入繪製3D柱狀圖所需要的包import matplotlib.pyplot as pltimport numpy as npimport matplotlib as mplimport randomfrom mpl_toolkits.mplot3d import Axes3D#設置字體大小mpl.rcParams['font.size'] = 10#生成圖紙,繪製3D柱狀圖子圖fig = plt.figure()ax = fig.add_subplot(111, projection='3d')#設置輔助參數,x = np.random.normal(平均數,標準差,生成數值的個數)samples = 25x = np.random.normal(5, 1, samples) # x上正態分布y = np.random.normal(3, .5, samples) # y上正態分布# xy平面上,按照10*10的網格劃分,落在網格內個數hist,x劃分邊界、y劃分邊界hist, xedges, yedges = np.histogram2d(x, y, bins=10)elements = (len(xedges) - 1) * (len(yedges) - 1)#設置作圖點的坐標,meshgrid函數用兩個坐標軸上的點在平面上畫格xpos, ypos = np.meshgrid(xedges[:-1] + .25, yedges[:-1] + .25)# 多維數組變為一維數組xpos = xpos.flatten()ypos = ypos.flatten()zpos = np.zeros(elements)#變量dx,dy表示每一個矩形條底部的寬度,這裡設置xy平面的每一個位置給定的值為0.1個點的寬度dx = .1 * np.ones_like(zpos) # zpos一致的全1數組dy = dx.copy()#定義了柱狀圖的高度dz = hist.flatten()# 每個立體以(xpos,ypos,zpos)為左下角,以(xpos+dx,ypos+dy,zpos+dz)為右上角ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b', alpha=0.4)plt.show()
5.3D柱狀圖與散點圖
在上述代碼基礎上增加
#給3D柱狀圖的x,y,z軸添加標籤名
ax.set_xlabel('X Axis')ax.set_ylabel('Y Axis')ax.set_zlabel('Z Axis')
#增加包括x,y軸坐標的散點圖子圖ax2=fig.add_subplot(212)ax2.scatter(x,y)ax2.set_xlabel('X Axis')ax2.set_ylabel('Y Axis')
因為要繪畫兩個子圖,所以要對上面的代碼進行一定的修改:
ax = fig.add_subplot(111, projection='3d')
修改為:ax = fig.add_subplot(211, projection='3d')