pandas 如何在数据透视表的折线图中显示更多类别

zpqajqem  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(181)

我有一个Excel文件,其中包含多行对象和至少两列变量:一个代表年份,一个代表类别。类别变量中有22种类型。
到目前为止,我可以将Excel文件读入DataFrame并应用透视表来显示每年每个类别的计数。我还可以按类别绘制这些年度计数。但是,当我这样做时,22个类别中只有4个被绘制出来。我如何指示Matplotlib显示22个类别中每个类别的绘图线和标签?
这是我的代码

import numpy as np
import pandas as pd
import matplotlib as plt
df = pd.read_excel("table_merged.xlsx", sheet_name="records", encoding="utf8")
df.pivot_table(index="year", columns="category", values="y_m_d", aggfunc=np.count_nonzero, fill_value="0").plot(figsize=(10,10))

我检查了matplotlib documentation中的plot()。唯一一个看起来与我要完成的任务有一点关系的参数是markevery(),但它产生了错误“positional argument follow keyword argument”,所以它看起来不正确。我能够成功地使用其他几个参数,比如虚线等。
这是 Dataframe

以下是matplotlib生成的结果图

这里是Excel中绘制的相同数据。我尝试使用matplotlib绘制一个类似的图

溶液

  • pivot(...,fill_value="0")更改为pivot(...,fill_value=0),所有类别都将按上面的代码显示在图中。在原始图中,显示的四个类别是22个类别中唯一没有任何年份的0值的类别。这就是显示它们的原因。matplotlib将忽略任何具有“0”值的类别。
  • 一个更简单、更好的解决方案是pd.crosstab(df['year'],df['category']),而不是我上面的第5行。
r3i60tvu

r3i60tvu1#

这个问题来自透视表,很可能你不需要它,因为你只是把年份和类别制表。y-m-d列一点用都没有。
请尝试以下操作:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'year':np.random.randint(2008,2020,1000),
                   'category':np.random.choice(np.arange(10),size=1000,p=np.arange(10)/sum(np.arange(10))),
                   'y_m_d':np.random.choice(['a','b','c'],1000)})

pd.crosstab(df['year'],df['category']).plot()

看看您的代码,错误来自:

pivot(...,fill_value="0")

您正在用字符串“0”填充,这会将列更改为其他内容,并且会被matplotlib忽略。它应该是fill_value=0,并且可以工作,尽管方法非常复杂......

相关问题