【问题标题】:Plot line graph from Pandas dataframe (with multiple lines)从 Pandas 数据框中绘制折线图(多条线)
【发布时间】:2018-06-01 11:09:32
【问题描述】:

我目前正在处理以下数据框。

总结内容,有一个“年龄”列,它与一个年龄组(即 16-25、26-32)相关 - 然后是 8 个班级百分比值,这些是百分比值,告诉我有多少百分比某个年龄组属于那个特定的社会阶层。所以在这个例子中,ID 为 1 的年龄组中有 10.81%(四舍五入)也属于 ID 为 1 的社会阶层。对于同一年龄组,社会阶层中有 22.34% ID 为 2,依此类推。每行总计为 100%。

我希望创建一个折线图,其中有一条线代表每个年龄段。所以这个图应该总共有 5 条线。

X 轴应该代表社会阶层(范围从 1 到 8),而 Y 轴应该代表该阶层中人数的百分比。

我正在寻找这种格式的图表,以便清楚地了解每个不同的年龄组、每个社会阶层中有多少人的模式,以及随着年龄的增长这种变化。

如有任何帮助,我将不胜感激,我什至不知道从哪里开始?我在网上尝试了一些示例,但似乎没有任何效果。即使是首发也很棒。

谢谢。

【问题讨论】:

    标签: python pandas dataframe graph line


    【解决方案1】:

    你可以用两行来完成。首先,您可以简单地转置您的数据集,使其具有您想要绘制的形状:

    df_plot = df.set_index('age').T
    

    这会产生(数字是随机生成的,与您提供的数字不同):

    age          1       2       3       4       5
    class1  0.5377  0.2147  0.4837  0.8682  0.3429
    class2  0.8350  0.0544  0.4314  0.6592  0.6475
    class3  0.9382  0.0283  0.7152  0.0962  0.3012
    class4  0.7277  0.1523  0.3124  0.0077  0.4039
    class5  0.7580  0.4149  0.1352  0.5068  0.2955
    class6  0.3243  0.3346  0.2820  0.8481  0.9782
    class7  0.2298  0.0522  0.7307  0.9851  0.8681
    class8  0.3283  0.0562  0.9052  0.6320  0.6140
    

    然后通过调用内置绘图函数生成绘图:

    df_plot.plot(figsize=(10,6), xticks=range(0, 8)).legend(title='age', bbox_to_anchor=(1, 1))
    

    这会导致:

    【讨论】:

      【解决方案2】:

      您可能对堆积面积图感兴趣。这应该适用于您的 DataFrame,名为 df:

      df.drop(columns='age').plot(kind='area', stacked=True)
      

      一个问题是,与绘图区域的垂直顺序相比,图例项将以相反的顺序显示。要解决此问题,您可以手动反转图例句柄和标签:

      ax = plt.gca()
      leg_handles, leg_labels = ax.get_legend_handles_labels()
      ax.legend(leg_handles[::-1], leg_labels[::-1])
      

      这是一些示例数据(发布文本,而不是图像,因此我们可以轻松复制粘贴和实验 :)):

      df = pd.DataFrame({'age': [1, 2, 3], 
                         'Class1': [22, 14, 26], 
                         'Class2': [14, 15, 14], 
                         'Class3': [64, 71, 60]
                        })
      

      输出:

      要反转绘图中的垂直顺序以使第 1 类最终位于顶部,请在绘图前按降序对列 (axis=1) 进行排序:

      df.drop(columns='age').sort_index(axis=1, ascending=False)plot(kind='area', stacked=True)
      

      【讨论】:

        【解决方案3】:

        根据您的要求创建折线图的可能解决方案是(使用虚拟数据集):

        import matplotlib.pyplot as plt
        import pandas as pd
        
        df=pd.DataFrame({"age":[1,2,3,4,5],"class1":[0.1,0.2,0.3,0.3,0.6],"class2":[0.4,0.1,0.2,0.3,0.6],"class3":[0.1,0.7,0.8,0.3,0.5]})
        df=df.set_index("age")
        for i in range(len(df)):
            plt.plot([k for k in df.columns],[df[y].iloc[i] for y in df.columns])
        plt.legend(df.index,loc="upper left")
        plt.show()
        

        输出: 不过可能不是最pythonic的方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-28
          • 2019-10-27
          • 2016-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多