繁体   English   中英

Plot 线图来自 Pandas dataframe(多线)

[英]Plot line graph from Pandas dataframe (with multiple lines)

我目前正在处理以下 dataframe。

数据框

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

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

X 轴应代表社会阶层(从 1 到 8),Y 轴应代表 class 中的人口百分比。

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

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

谢谢。

您可以分两行进行。 首先,您可以简单地转置您的数据集,使其处于您想要的形状 plot 它:

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

然后通过调用内置的 plot function 生成一个 plot:

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

这导致: 在此处输入图像描述

您可能对堆叠区域 plot 感兴趣。这应该适用于您的 DataFrame,名为df

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

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

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

Output: 堆栈图演示

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

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

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

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

Output: 在此处输入图像描述 虽然可能不是最pythonic的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM