Цвет столбца в диаграмме на основе логического значения в той же строке фрейма данных

#python #pandas #matplotlib

#python #панды #matplotlib

Вопрос:

Я пытаюсь построить гистограмму, на цвет столбцов которой влияет логическое значение в той же строке фрейма данных. В этом примере я хочу has_chocolate , False чтобы он был красным и True зеленым, когда sales они помещаются в столбчатую диаграмму.

 import pandas as pd
import matplotlib.pyplot as plt
 
 cake_sales_df

index     cake          sales          has_chocolate
0         empire        15             False
1         tea cake      25             True
2         snowball      20             True
3         hob-nob       50             True
4         lotus         3              False
 

Что я пытался до сих пор с использованием внешней функции или условия

 cake_sales_df.plot(x='cake', y='sales',
                        kind='bar', color = 'green' if cakes_sales_df['has_chocolate'] == True else 'red')
 

все ли получили одну и ту же ошибку

 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 

Ответ №1:

Вы можете свернуть данные:

 (df.pivot(index='cake',columns='has_chocolate',values='sales')
   .plot.bar(stacked=True)
)
 

Вывод:

введите описание изображения здесь

Или вы можете использовать seaborn:

 import seaborn as sns

sns.barplot(data=df, x='cake', y='sales', hue='has_chocolate',
            palette={True:'g', False:'r'},
            dodge=False)
 

Вывод:

введите описание изображения здесь

Комментарии:

1. Блестящее спасибо! Я все еще новичок в этом, и seaborn — это все еще то, что я должен привнести в свои навыки.

Ответ №2:

Я смог использовать matplotlib для создания гистограммы. Но из-за отсутствия репутации изображение не встроено. Вместо этого предоставляются ссылки на imgur.

 import pandas as pd
from matplotlib.patches import Patch

columns = ['cake', 'sales', 'has_chocolate']
df = pd.DataFrame([['empire', 15, False],['tea cake',25, True],['snowball', 20, True],['hob-nob', 50, True],['lotus', 3, False]], columns = columns).set_index('cake')
df
 

данные в jupyter

 colours = {True: "#44bd32", False: "#273c75"}
df['sales'].plot(
    kind="bar", 
    color=df['has_chocolate'].replace(colours)
).legend(
    [   Patch(facecolor=colours[True]),
        Patch(facecolor=colours[False])
    ], [True, False]
)
 

столбчатая диаграмма