Python Гистограмма pyplot Matplotlib - PullRequest
3 голосов
/ 10 июля 2020

Я рисую гистограмму довольно простой симуляции. На гистограмме два последних столбца объединены, и это выглядит странно. Пожалуйста, найдите приложенный ниже код и результат построения.

Заранее спасибо!

   import numpy as np
   import random
   import matplotlib.pyplot as plt

   die = [1, 2, 3, 4, 5, 6]
   N = 100000
   results = []
   # first round
   for i in range(N):
       X1 = random.choice(die)
       if X1 > 4:
           results.append(X1)
       else:
           X2 = random.choice(die)
           if X2 > 3:
               results.append(X2)
           else:
               X3 = random.choice(die)
               results.append(X3)

   plt.hist(results)
   plt.ylabel('Count')
   plt.xlabel('Result');
   plt.title("Mean results: " + str(np.mean(results)))
   plt.show()

Результат выглядит следующим образом. Я не понимаю, почему последние два столбца слиплись.

Гистограмма

Любая помощь приветствуется!

Ответы [ 3 ]

1 голос
/ 10 июля 2020

По умолчанию matplotlib делит диапазон ввода на 10 бинов одинакового размера. Все ячейки охватывают полуоткрытый интервал [x1,x2), но крайняя правая ячейка включает конец диапазона. Ваш диапазон - [1,6], поэтому ваши ячейки - [1,1.5), [1.5,2), ..., [5.5,6], поэтому все целые числа попадают в первое, третье и т.д. c. Ячейки с нечетными номерами, но шестерки попадают в десятую (четную) ячейку.

Чтобы исправить макет, укажите ячейки:

# This will give you a slightly different layout with only 6 bars
plt.hist(results, bins=die + [7])
# This will simulate your original plot more closely, with empty bins in between
plt.hist(results, bins=np.arange(2, 14)/2)

Последний бит генерирует числовую последовательность 2,3,...,13, а затем делит каждое число на 2, что дает 1, 1.5, ..., 6.5, так что последняя ячейка занимает [6,6.5].

1 голос
/ 10 июля 2020

Вам нужно указать matplotlib, что вы хотите, чтобы гистограмма соответствовала ячейкам. В противном случае matplotlib выберет для вас значение по умолчанию 10 - в этом случае округление не очень хорошее.

# ... your code ...

plt.hist(results, bins=die)  # or bins = 6
plt.ylabel('Count')
plt.xlabel('Result');
plt.title("Mean results: " + str(np.mean(results)))
plt.show()

Полная документация здесь: https://matplotlib.org/3.2.2/api/_as_gen/matplotlib.pyplot.hist.html

0 голосов
/ 10 июля 2020

нет, но вы можете попробовать.

import seaborn as sns
sns.distplot(results , kde = False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...