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

3
我目前正在处理下面的数据框。

Dataframe

简单概括内容,有一个“年龄”列,它与年龄组相关(例如16-25岁,26-32岁) - 然后8个课程%值,这些是百分比值,告诉我在特定社会阶层中有多少百分比的某一年龄组。因此,在此示例中,有10.81%(舍入)的ID为1的年龄组人口也属于ID为1的社会阶层。对于同一年龄组,ID为2的社会阶层的人数占22.34%,以此类推。每行合计为100%。
我想创建一条线图,其中有一条线表示每个年龄组。因此,此图应总共有5条线。
X轴应表示社会阶层(从1到8),Y轴应表示该类别中人员的百分比。
我希望以这种格式呈现图形,以清楚地看到每个不同年龄组中有多少人属于每个社会阶层,并且随着年龄的增长而发生了什么变化。
这方面的任何帮助都将不胜感激,我甚至不确定从哪里开始?我尝试了一些在线示例,但似乎没有起作用。即使有一个起点也会很好。
谢谢。
3个回答

2

您可以用两行代码完成此操作。首先,您可以简单地转置数据集,使其呈现出您想要绘制的形状:

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

这将导致: 在此输入图片描述

1
你可能对堆叠区域图感兴趣。这应该适用于你的 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

为了使类别1出现在顶部,需要在绘图之前按照降序(axis=1)对列进行排序:

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

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

输出: 输入图像描述 虽然可能不是最具Python风格的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接