Столбчатая диаграмма с пустыми столбцами - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь сделать гистограмму с накоплением. Я могу сделать базовую гистограмму:

df = pd.DataFrame({'Y': [1,1,1,1,1,2,3,2],
                   'X': [2,2,2,2,3,3,3,4]})

Y_1 = df.loc[df['Y'] == 1]
Y_2 = df.loc[df['Y'] == 2]

Count_0 = df.groupby(['X']).size().to_frame('Count').reset_index()
Count_1 = Y_1.groupby(['X']).size().to_frame('Count').reset_index()
Count_2 = Y_2.groupby(['X']).size().to_frame('Count').reset_index()

height_0 = Count_0.Count
height_1 = Count_1.Count
height_2 = Count_2.Count
bars     = Count_0.X

fig, (ax1) = plt.subplots(1,1);

y_pos = np.arange(len(bars))

p1 = plt.bar(y_pos, height_0) 

for item in ([ax1.title, ax1.xaxis.label, ax1.yaxis.label] +
             ax1.get_xticklabels() + ax1.get_yticklabels()):
    item.set_fontsize(22)

plt.xlabel('X')
plt.ylabel('Count')
plt.xticks(y_pos, bars)
plt.yticks(np.arange(0, 4.1, 1))
fig = plt.gcf()
fig.set_size_inches(18.5, 10.5)
plt.show()
plt.clf()

enter image description here Но когда я пытаюсь сложить его по классу "Y":

p2 = plt.bar(y_pos, height_2, bottom = height_1)

Я получаю:

ValueError: incompatible sizes: argument 'height' must be length 3 or scalar

Я думаю, что проблема может заключаться в том, что есть пустые столбцы с Y = 2 и Y = 3, потому что у этих классов нет экземпляров с X = 2. Я хотел бы, чтобы X на оси X и Y были цветом, пожалуйста!

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

IIUC, вы хотите это:

df = pd.DataFrame({'Y': [1,1,1,1,1,2,3,2],
                   'X': [2,2,2,2,3,3,3,4]})
df.groupby(['X','Y'])['Y'].count().unstack().plot.bar(stacked=True)

Выход:

enter image description here

0 голосов
/ 18 апреля 2019

Если вы можете сделать это, используя другую библиотеку графиков Python, то вот подход для гистограммы с накоплением, использующий Альтаир - нет необходимости groupby необходимо

Импорт и настройка

import altair as alt
alt.renderers.enable('notebook')

График с накоплением

alt.Chart(df).mark_bar().encode(
    alt.X('X:N', axis=alt.Axis(labelAngle=0, tickSize=10)),
    alt.Y('count(Y):Q', axis=alt.Axis(title='Total count')),
    color='Y:N'
).properties(
    width=350,
    height=350
).configure_axis(
    titleFontSize=14,
    labelFontSize=12
).configure_legend(
    titleFontSize=14,
    labelFontSize=12
)

выход

Output

Вот ссылки на Настройка

Начальная попытка

Удалено из-за неправильной интерпретации OP-вопроса.

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