如何使用matplotlib

时间:2019-01-12 01:18:49

标签: python matplotlib histogram

因此,我在Python Crash课程书中遇到了问题,在第15章“自己尝试”一节的末尾,问题15-10的任务是“尝试使用matplotlib进行压模可视化... “我已经布置了所有信息,没有任何错误,但是当程序运行时,直方图会显示图形和轴,但不会显示实际数据。有人知道为什么会发生这种情况以及我缺少什么吗?

有一个名为Die()的模块和类,用于初始化和随机创建胶卷。该类和程序可以完美运行,并在下面的程序中被调用。

骰子频率直方图的应用

import matplotlib
import matplotlib.pyplot as plt
from die import Die

# create two D6 dice
die_1 = Die()
die_2 = Die()

# make some rolls, and store results in a list.
results = []
for roll_num in range(5000):
    result = die_1.roll() + die_2.roll()
    results.append(result)

# analyze the results.
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)

plt.bins = []
x_max = die_1.num_sides + die_2.num_sides
for label in range(2, x_max+1):
    plt.bins.append(label)
print(frequencies)
plt.hist(frequencies, plt.bins, histtype = 'bar', facecolor = 'blue')

plt.title("Dice Plot")
plt.xlabel("Results")
plt.ylabel("Frequency of Result")
plt.axis([0,12,0,300])
plt.show()

我希望获得一个法线曲线模型外观的数据集。但是,我没有显示任何数据。再次显示图形和轴,但不显示实际数据。

2 个答案:

答案 0 :(得分:0)

如果使用六面骰子并且滚动5000次,则频率值都在450 +/-范围内。您告诉plt.hist,bin的边缘是2到12,因此您所有的条形图都在图的右侧成比例。

有11个可能的值,所以告诉.hist有11个垃圾箱。

plt.hist(freqs,11)

更好的是,您应该让.hist确定频率-我认为这确实是您想要的。

plt.hist(results,11)

答案 1 :(得分:0)

我想您不应尝试绘制已经直方图化的值的直方图。而是直接使用results。您可以调整垃圾箱以反映结果实际上是离散的事实。

import numpy as np
import matplotlib.pyplot as plt

class Die():
    num_sides=6
    def roll(self):
        return np.random.randint(1,self.num_sides+1)

# create two D6 dice
die_1 = Die()
die_2 = Die()

# make some rolls, and store results in a list.
results = []
for roll_num in range(5000):
 result = die_1.roll() + die_2.roll()
 results.append(result)

# analyze the results.
frequencies = []
max_result = die_1.num_sides + die_2.num_sides

x_max = die_1.num_sides + die_2.num_sides

plt.hist(results, bins=np.arange(2, max_result+2)-.5, histtype = 'bar', 
         rwidth=0.8, facecolor = 'blue', edgecolor="k")

plt.title("Dice Plot")
plt.xlabel("Results")
plt.ylabel("Frequency of Result")

plt.show()

enter image description here