Python:基于同一DF中多列值的堆积条形图[重复]
Posted
技术标签:
【中文标题】Python:基于同一DF中多列值的堆积条形图[重复]【英文标题】:Python: Stacked bar plot based on values from multiple columns within the same DF [duplicate] 【发布时间】:2021-12-11 21:34:25 【问题描述】:假设我们有一个像下面这样的 DF:
channel store product orders
offline Swindon webcam 97
offline Kettering webcam 28
offline Swindon ebook 55
offline Kettering ebook 77
offline Swindon tablet 122
offline Kettering tablet 81
online Swindon webcam 252
online Kettering webcam 111
online Swindon ebook 81
online Kettering ebook 244
online Swindon tablet 361
online Kettering tablet 49
我的目标是绘制一个带有 4 个堆叠条形图(每个商店和渠道组合一个),显示每种产品在每个产品中的销售百分比。
【问题讨论】:
Code and Plot 根据副本 【参考方案1】:您可以从channel
和store
创建列,然后用seaborn
绘制barplot
,如下所示:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame(
'channel': ['offline', 'offline', 'offline', 'offline', 'offline', 'offline', 'online' , 'online' ,'online' ,'online' ,'online' ,'online' ,],
'store': ['Swindon', 'Kettering', 'Swindon', 'Kettering','Swindon', 'Kettering','Swindon', 'Kettering','Swindon', 'Kettering','Swindon', 'Kettering',],
'product': ['webcam', 'webcam', 'ebook', 'ebook', 'tablet' , 'tablet' , 'webcam' , 'webcam' , 'ebook' , 'ebook' , 'tablet' , 'tablet'],
'orders': [97,28,55,77,122,81,252,111,81,244,361,49],
)
df['Channel&Store'] = df.apply(lambda row: f'row[0] row[1]', axis=1)
sns.barplot(x="Channel&Store", y="orders" , hue = 'product', data=df)
plt.show()
输出:
【讨论】:
【参考方案2】:最简单的方法是先创建一个数据透视表,然后绘制它:
df.pivot_table(index=["channel", "store"], columns='product', values='orders', aggfunc='sum').plot(kind='bar', stacked=True)
事实上,你甚至不需要pivot_table
,因为不需要对数据进行任何计算,所以你可以像这样重新排序表格:
df.pivot(index=["channel", "store"], columns='product', values='orders').plot(kind='bar', stacked=True)
并且会收到相同的结果。
【讨论】:
以上是关于Python:基于同一DF中多列值的堆积条形图[重复]的主要内容,如果未能解决你的问题,请参考以下文章