【发布时间】:2021-11-13 11:35:41
【问题描述】:
我有一个非常庞大的数据集,其中有很多子公司为不同国家的三个客户群提供服务,如下所示(实际上有更多的子公司和日期):
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'subsidiary': ['EU','EU','EU','EU','EU','EU','EU','EU','EU','US','US','US','US','US','US','US','US','US'],'date': ['2019-03','2019-04', '2019-05','2019-03','2019-04', '2019-05','2019-03','2019-04', '2019-05','2019-03','2019-04', '2019-05','2019-03','2019-04', '2019-05','2019-03','2019-04', '2019-05'],'business': ['RETAIL','RETAIL','RETAIL','CORP','CORP','CORP','PUBLIC','PUBLIC','PUBLIC','RETAIL','RETAIL','RETAIL','CORP','CORP','CORP','PUBLIC','PUBLIC','PUBLIC'],'value': [500.36,600.45,700.55,750.66,950.89,1300.13,100.05,120.00,150.01,800.79,900.55,1000,3500.79,5000.36,4500.25,50.17,75.25,90.33]})
print(df)
我想通过生成堆积条形图对每个子公司进行分析。为此,我首先将 x 轴定义为唯一的月份,并在这样的国家/地区为每种业务类型定义一个子集:
x=df['date'].drop_duplicates()
EUCORP = df[(df['subsidiary']=='EU') & (df['business']=='CORP')]
EURETAIL = df[(df['subsidiary']=='EU') & (df['business']=='RETAIL')]
EUPUBLIC = df[(df['subsidiary']=='EU') & (df['business']=='PUBLIC')]
然后我可以为每种业务类型制作条形图:
plotEUCORP = plt.bar(x=x, height=EUCORP['value'], width=.35)
plotEURETAIL = plt.bar(x=x, height=EURETAIL['value'], width=.35)
plotEUPUBLIC = plt.bar(x=x, height=EUPUBLIC['value'], width=.35)
但是,如果我尝试将所有三个叠加在一个图表中,我总是失败:
plotEURETAIL = plt.bar(x=x, height=EURETAIL['value'], width=.35)
plotEUCORP = plt.bar(x=x, height=EUCORP['value'], width=.35, bottom=EURETAIL)
plotEUPUBLIC = plt.bar(x=x, height=EUPUBLIC['value'], width=.35, bottom=EURETAIL+EUCORP)
plt.show()
我总是收到以下错误消息:
ValueError:缺少 StrCategoryConverter 的类别信息;这可能是由于无意中混合了分类数据和数字数据造成的
ConversionError:无法将值转换为轴单位:子公司日期业务价值 0 欧盟 2019-03 零售 500.36 1 欧盟 2019-04 零售 600.45 2 欧盟 2019-05 零售 700.55
我尝试将月份转换为日期格式和/或对其进行索引,但它实际上让我更加困惑......
我非常感谢您在以下任何方面的任何帮助/支持,因为我已经花了很多时间来尝试解决这个问题(我仍然是 python 菜鸟,sry):
- 如何解决创建堆叠条形图的错误?
- 假设可以修复错误,这是创建条形图最有效的方法(例如,我真的需要为每个子公司创建三个 sub-dfs,还是有更优雅的方法?)
- 是否可以编写迭代代码,按国家/地区生成堆积条形图,这样我就不需要为每个子公司创建一个?
【问题讨论】:
标签: python matplotlib seaborn bar-chart stacked-chart