掷骰子,定义类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')

python 频率分布直方图 频率超过1 python 频数分布_柱状图

figure1

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)

其他内容保持不变,得到下图:

python 频率分布直方图 频率超过1 python 频数分布_python 3d图表_02

figure2

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()

python 频率分布直方图 频率超过1 python 频数分布_3d_03

figure3

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')

python 频率分布直方图 频率超过1 python 频数分布_柱状图_04