Как отобразить гистограмму Python Crash Course Chapter 15 с помощью matplotlib - PullRequest
0 голосов
/ 12 января 2019

Итак, у меня проблемы в книге «Ускоренный курс Python», и в конце главы 15-10 «Попробуйте сами», задача 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 голосов
/ 12 января 2019

Полагаю, вам не следует пытаться строить гистограмму уже гистограммированных значений. Вместо этого используйте 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

0 голосов
/ 12 января 2019

Если вы используете шестигранный кристалл и бросаете 5000 раз, все значения частоты находятся в диапазоне 450 +/-. Вы сказали plt.hist, что края корзины - от двух до двенадцати, поэтому все ваши столбцы зашкаливают в правой части графика.

Существует одиннадцать возможных значений, поэтому скажите .hist, что имеется одиннадцать корзин.

plt.hist(freqs,11)

Еще лучше, вы должны позволить .hist определять частоты - я думаю, что это действительно то, что вы хотите.

plt.hist(results,11)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...