#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
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]
)