Я все еще абсолютный новичок в python и много гуглил, чтобы создать код, позволяющий построить сложную гистограмму для моего df. Я использую spyder и python 3.12
После некоторой подготовки данных у меня остался этот df:
{'storage': {0: 'a', 2: 'a', 3: 'a', 4: 'b', 5: 'b'},
'time': {0: '4h', 2: '4h', 3: '4h', 4: '4h', 5: '4h'},
'Predicted Class': {0: 'germling',
2: 'resting',
3: 'swollen',
4: 'germling',
5: 'hyphae'},
'%': {0: 0.22, 2: 99.02, 3: 0.76, 4: 65.41, 5: 1.72}}
Я готовлю его с поворотом для построения в виде гистограммы с накоплением.
class_order = ['resting', 'swollen', 'germling', 'hyphae', 'mature hyphae']
counts2_reduced_df['Predicted Class'] = pd.Categorical(counts2_reduced_df['Predicted Class'], categories=class_order, ordered=True)
counts2_pivot_df = counts2_reduced_df.pivot_table(index=["storage","time"], columns = "Predicted Class", values = "%", aggfunc = "sum")
В результате у меня остается этот df, который теперь содержит ячейки с 0 в качестве значений, которые я хотел бы предотвратить отрисовку на графике.
Когда я сейчас рисую этот df, я получаю следующий график (у него все еще есть другие проблемы, такие как читаемость значений небольших процентов, но я думаю, это проблема для другого поста).
Я пробовал разные подходы, такие как преобразование 0s в nas, а затем drop.na, конечно, удаляет целые строки, но я хотел бы предотвратить отображение/отображение на графике только ячеек, содержащих 0s.
Я пробовал counts2_pivot_df = counts2_pivot_df.replace(0, ""), но это полностью предотвращает отображение столбцов «гифы» и «зрелые гифы».
{'resting': {('a', '4h'): 99.02, ('b', '4h'): 2.57, ('c', '4h'): 2.19},
'swollen': {('a', '4h'): 0.76, ('b', '4h'): 30.19, ('c', '4h'): 25.57},
'germling': {('a', '4h'): 0.22, ('b', '4h'): 65.41, ('c', '4h'): 70.67},
'hyphae': {('a', '4h'): '', ('b', '4h'): 1.72, ('c', '4h'): 1.47},
'mature hyphae': {('a', '4h'): '', ('b', '4h'): 0.11, ('c', '4h'): 0.1}}
Есть ли способ решить эту проблему? Я прочитал и попробовал много сообщений, но не смог найти решения.
Обновлено:
Это код, который я использую для создания графиков:
fig, ax = plt.subplots()
# Colors for each class,
color_mapping = {
'resting': 'yellow',
'swollen': 'blue',
'germling': 'red',
'hyphae': 'cyan',
'mature hyphae': 'green',
}
# Colors for each class using the mapping
colors = [color_mapping[class_name] for class_name in class_order] # Ensure colors follow the same order
# Plotting the stacked bars
counts2_pivot_df.plot(kind='bar', stacked=True, color=colors, ax=ax)
# Set x-tick labels correctly based on the pivot index
ax.set_xticks(range(len(counts2_pivot_df.index)))
ax.set_xticklabels([f'{i[0]} & {i[1]}' for i in counts2_pivot_df.index], rotation=0)
ax.set_xlabel('Storage Condition and Time after Inoculation')
ax.set_ylabel('Percentage (%)')
plt.xticks(rotation=360)
plt.legend(title='Predicted Class')
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
# Annotating percentages
for n, bar_group in enumerate(ax.containers):
for bar in bar_group:
height = bar.get_height()
text_x = bar.get_x() + bar.get_width() / 2
text_y = bar.get_y() + height / 2
ha = 'center' if height > 5 else 'left'
va = 'center'
text_x_adjusted = text_x if height > 5 else bar.get_x() + bar.get_width()
ax.annotate(f'{height:.2f}%', xy=(text_x_adjusted, text_y), ha=ha, va=va, color='black', fontsize=8, fontweight='bold')
plt.show()
Спасибо за ваш ответ. К сожалению, это не сработало. Он по-прежнему показывает 0,00% в первом столбце с накоплением (a и 4h).
В соответствии с просьбой обновите свой минимально воспроизводимый пример, добавив код для создания графиков.
Спасибо! Я совершенно упустил, что не включил код сюжета!






Поскольку вы рисуете метки вручную, проще всего добавить continue в цикл, когда высота равна нулю:
for bar in bar_group:
height = bar.get_height()
if height == 0:
continue
text_x = bar.get_x() + bar.get_width() / 2
text_y = bar.get_y() + height / 2
ha = 'center' if height > 5 else 'left'
va = 'center'
text_x_adjusted = text_x if height > 5 else bar.get_x() + bar.get_width()
ax.annotate(f'{height:.2f}%', xy=(text_x_adjusted, text_y), ha=ha, va=va, color='black', fontsize=8, fontweight='bold')
Выход:
Спасибо! Действительно здорово! Могу ли я попросить вас изучить и понять: существовало ли альтернативное решение, кроме нанесения меток вручную?
QA с очень подробным ответом здесь.
Просто замените на NaN:
counts2_pivot_df.replace(0, float('nan')). Какую именно команду вы использовали для печати меток?