Сложность выравнивания xticks по краю ячейки гистограммы - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь показать частоту моих данных в течение дня, используя гистограмму, с 3-часовыми интервалами. Поэтому я использую 8 ячеек.

plt.style.use('seaborn-colorblind')

plt.figure(figsize=(10,5))
plt.hist(comments19['comment_hour'], bins = 8, alpha = 1, align='mid', edgecolor = 'white', label = '2019', density=True)
plt.title('2019 comments, 8 bins')
plt.xticks([0,3,6,9,12,15,18,21,24])
plt.xlabel('Hours of Day')
plt.ylabel('Relative Frequency')
plt.tight_layout()
plt.legend()
plt.show()

Однако галочки не совпадают с краями ящика, как показано на изображении ниже.

Histogram Matplotlib Image

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы можете сделать либо:

plt.figure(figsize=(10,5))

# define the bin and pass to plt.hist
bins = [0,3,6,9,12,15,18,21,24]
plt.hist(comments19['comment_hour'], bins = bins, alpha = 1, align='mid', 

# remove this line
# plt.xticks([0,3,6,9,12,15,18,21,24])
edgecolor = 'white', label = '2019', density=True)
plt.title('2019 comments, 8 bins')
plt.xlabel('Hours of Day')
plt.ylabel('Relative Frequency')
plt.tight_layout()
plt.legend()
plt.show()

, либо:

fig, ax = plt.subplots()

bins = np.arange(0,25,3)
comments19['comment_hour'].plot.hist(ax=ax,bins=bins)

# other plt format
0 голосов
/ 29 мая 2020

Если вы установите bins=8, seaborn установит 9 границ с равномерным распределением, от самого низкого значения во входном массиве (0) до самого высокого (23), то есть на [0.0, 2.875, 5.75, 8.625, 11.5, 14.375, 17.25, 20.125, 23.0]. Чтобы получить 9 границ в 0, 3, 6, ..., вам необходимо установить их явно.

import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt

plt.style.use('seaborn-colorblind')

comments19 = pd.DataFrame({'comment_hour': np.random.randint(0, 24, 100)})

plt.figure(figsize=(10, 5))
plt.hist(comments19['comment_hour'], bins=np.arange(0, 25, 3), alpha=1, align='mid', edgecolor='white', label='2019',
         density=True)
plt.title('2019 comments, 8 bins')
plt.xticks(np.arange(0, 25, 3))
plt.xlabel('Hours of Day')
plt.ylabel('Relative Frequency')
plt.tight_layout()
plt.legend()
plt.show()

example plot

Обратите внимание, что ваш density=True означает, что общая область гистограммы равна 1. Поскольку ширина каждого интервала составляет 3 часа, сумма всех высот интервалов будет 0.33, а не 1.00, как вы могли ожидать. Чтобы действительно получить ось Y с относительными частотами, вы можете сделать внутреннюю ширину бина 1, разделив часы на 3. Впоследствии вы можете изменить метку оси X на часы.

Таким образом, следующие изменения могут быть сделаны для всех интервалов, чтобы суммировать их до 100%:

from matplotlib.ticker import PercentFormatter

plt.hist(comments19['comment_hour'] / 3, bins=np.arange(9), alpha=1, align='mid', edgecolor='white', label='2019',
         density=True)
plt.xticks(np.arange(9), np.arange(0, 25, 3))
plt.gca().yaxis.set_major_formatter(PercentFormatter(1))

summing to 100%

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