【问题标题】:How to show more categories in a Matplotlib line plot of a Pandas DataFrame Pivot Table?如何在 Pandas DataFrame 数据透视表的 Matplotlib 线图中显示更多类别?
【发布时间】:2020-06-04 01:20:15
【问题描述】:

我有一个 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))

我检查了 documentation 的 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 行。

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    问题出在枢轴上,很可能您不需要它,因为您只是在制表年份和类别。 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,它会工作,虽然方法很复杂......

    【讨论】:

    • pivot(...,fill_value="0") 更改为pivot(...,fill_value=0) 导致所有类别都出现。我添加了y_m_d 以将交叉表限制为单列。如果我删除values="y_m_d",它会为表格中的每一列绘制额外的行,列出年份和类别。显然我没有正确地做到这一点。 pd.crosstab(df['year'],df['category']) 简单地产生所需的结果。谢谢,我打算阅读交叉表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多