Графики ненормализованной гистограммы в Seaborn не центрированы по оси X - PullRequest
0 голосов
/ 06 мая 2020

Я рисую график количества случаев, когда значение встречается в двух разных наборах данных. Один график (график 1) отображается идеально, столбцы находятся прямо над числами на оси абсцисс. На втором графике (график 2) должны быть две полосы, одна над 1 значением оси x, а другая над 2 значениями оси x, но обе полосы толстые и зажаты между 1 и 2 по оси x. Как мне сделать так, чтобы второй график выглядел как первый?

Это код, который я использовал в записной книжке Jupyter для создания обоих графиков.

plot = sns.distplot(x7, kde=False)
for bar in plot.patches:
    h = bar.get_height()
    if h != 0:
        plot.text(bar.get_x() + bar.get_width() / 2,
                  h,
                  f'{h:.0f}\n',
                  ha='center',
                  va='center')

plot1 plot2

1 Ответ

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

Проблема в том, что вы используете гистограмму, предназначенную для непрерывного распределения, и используете ее для дискретных данных. Для дискретных данных лучше всего создавать явные интервалы. При желании можно установить более широкие пределы, а также установить явные отметки на каждом из столбцов.

Вот пример с ячейками шириной 0,2:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

data1 = np.random.choice(np.arange(1, 8), 200)
data2 = np.random.choice(np.arange(1, 3), 40)

fig, axs = plt.subplots(ncols=2)

for data, ax in zip([data1, data2], axs):
    minx, maxx = data.min(), data.max()
    plot = sns.distplot(data, bins=np.arange(minx - 0.1, maxx+ 0.2, 0.2), kde=False, ax=ax)
    plot.set_xlim(minx-0.9, maxx+0.9)
    plot.set_xticks(np.unique(data))
    for bar in plot.patches:
        h = bar.get_height()
        if h != 0:
            plot.text(bar.get_x() + bar.get_width() / 2,
                      h,
                      f'{h:.0f}\n',
                      ha='center',
                      va='center')
plt.show()

example plot

...