从Pandas数据框绘制折线图(有多行)

时间:2018-06-01 11:09:32

标签: python pandas dataframe graph line

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

Dataframe

总结一下内容,有一个“年龄”栏,它涉及一个年龄组(即16-25,26-32) - 然后是8个%%的值,这些是百分比值告诉我的百分比某个年龄组属于特定的社会阶层。因此,在这个例子中,年龄组中人口的10.81%(四舍五入),ID为1,也是社会阶层,ID为1.对于同一年龄组,社会阶层中有22.34% ID为2,依此类推。每行总计为100%。

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

X轴应该代表社交类(范围从1到8),Y轴应该代表该类中人的百分比。

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

对此有任何帮助将不胜感激,我甚至不确定从哪里开始?我在网上尝试了一些例子,但似乎没什么用。即使是首发也很棒。

感谢。

3 个答案:

答案 0 :(得分:0)

您可能对堆积区域图感兴趣。这应该适用于您的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]
                  })

输出: Stackplot demo

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

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

答案 1 :(得分:0)

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

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()

输出: enter image description here 可能不是最恐怖的方式。

答案 2 :(得分:0)

你可以分两行完成。首先,您可以简单地转置数据集,使其处于您想要绘制的形状中:

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))

这导致: enter image description here