Python 如何在DataFrame数据透视表的Matplotlib线图中显示更多类别?

Python 如何在DataFrame数据透视表的Matplotlib线图中显示更多类别?,python,pandas,matplotlib,Python,Pandas,Matplotlib,我有一个Excel文件,其中包含至少两列变量的对象行:一列用于年份,一列用于类别。类别变量中有22种类型 到目前为止,我可以将Excel文件读入数据框,并应用透视表来显示每年每个类别的计数。我还可以按类别绘制这些年度计数。然而,当我这样做时,22个类别中只有4个被绘制如何指示Matplotlib显示22个类别中每个类别的打印线和标签? 这是我的密码 import numpy as np import pandas as pd import matplotlib as plt df = pd.re

我有一个Excel文件,其中包含至少两列变量的对象行:一列用于年份,一列用于类别。类别变量中有22种类型

到目前为止,我可以将Excel文件读入数据框,并应用透视表来显示每年每个类别的计数。我还可以按类别绘制这些年度计数。然而,当我这样做时,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的
plot()
。唯一一个似乎与我试图实现的目标有着千丝万缕联系的参数是
markevery()
,但它产生了错误“位置参数跟随关键字参数”,因此它似乎不正确。我成功地使用了其他几个参数,比如虚线等等

这是数据帧

以下是matplotlib生成的结果图

以下是在Excel中绘制的相同数据。我正在尝试使用matplotlib绘制类似的图

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

这个问题来自于pivot,很可能您不需要它,因为您只是将年份和类别列表。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\u value=0
,虽然方法非常复杂,但它还是会起作用的。

这个问题与轴有关,很可能您不需要它,因为您只是将年份和类别制成表格。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\u value=0
,它会起作用,尽管将
pivot(…,fill\u value=“0”)
更改为
pivot(…,fill\u value=0)
会导致所有类别出现。我添加了
y\m\u d
以将交叉表约束到单个列。如果我删除
values=“y\u m\u d”
它会为表格中的每一列绘制额外的行,列出年份和类别。很明显,我做得不好<代码>pd.交叉表(df['year'],df['category'])简单地生成所需的结果。谢谢,我计划阅读交叉表。将
pivot(…,fill\u value=“0”)
更改为
pivot(…,fill\u value=0)
会导致所有类别出现。我添加了
y\m\u d
以将交叉表约束到单个列。如果我删除
values=“y\u m\u d”
它会为表格中的每一列绘制额外的行,列出年份和类别。很明显,我做得不好<代码>pd.交叉表(df['year'],df['category'])简单地生成所需的结果。谢谢,我打算读一下交叉表。