Как построить строки, содержащие na, в сложенной гистограмме Python?

Я все еще абсолютный новичок в 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()

Просто замените на NaN: counts2_pivot_df.replace(0, float('nan')). Какую именно команду вы использовали для печати меток?

mozway 27.05.2024 09:13

Спасибо за ваш ответ. К сожалению, это не сработало. Он по-прежнему показывает 0,00% в первом столбце с накоплением (a и 4h).

mr.raccoon 27.05.2024 10:11

В соответствии с просьбой обновите свой минимально воспроизводимый пример, добавив код для создания графиков.

mozway 27.05.2024 12:04

Спасибо! Я совершенно упустил, что не включил код сюжета!

mr.raccoon 27.05.2024 12:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы рисуете метки вручную, проще всего добавить 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')

Выход:

Спасибо! Действительно здорово! Могу ли я попросить вас изучить и понять: существовало ли альтернативное решение, кроме нанесения меток вручную?

mr.raccoon 27.05.2024 13:54

QA с очень подробным ответом здесь.

mozway 27.05.2024 13:56

Другие вопросы по теме