繁体   English   中英

在 Matplotlib 中绘制带有图例的数据框线图

[英]Graphing a dataframe line plot with a legend in Matplotlib

我正在处理一个具有成绩和州的数据集,需要按州创建折线图,以显示每个州的学生落入哪些垃圾箱的百分比。

我的方法(到目前为止)如下:首先我导入数据集:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


records = [{'Name':'A', 'Grade':'.15','State':'NJ'},{'Name':'B', 'Grade':'.15','State':'NJ'},{'Name':'C', 'Grade':'.43','State':'CA'},{'Name':'D', 'Grade':'.75','State':'CA'},{'Name':'E', 'Grade':'.17','State':'NJ'},{'Name':'F', 'Grade':'.85','State':'HI'},{'Name':'G', 'Grade':'.89','State':'HI'},{'Name':'H', 'Grade':'.38','State':'CA'},{'Name':'I', 'Grade':'.98','State':'NJ'},{'Name':'J', 'Grade':'.49','State':'NJ'},{'Name':'K', 'Grade':'.17','State':'CA'},{'Name':'K', 'Grade':'.94','State':'HI'},{'Name':'M', 'Grade':'.33','State':'HI'},{'Name':'N', 'Grade':'.22','State':'NJ'},{'Name':'O', 'Grade':'.7','State':'NJ'}]
df = pd.DataFrame(records)
df.Grade = df.Grade.astype(float)

接下来我将每个年级切成一个垃圾箱

df['bin'] = pd.cut(df['Grade'],[-np.inf,.05,.1,.15,.2,.25,.3,.35,.4,.45,.5,.55,.6,.65,.7,.75,.8,.85,.9,.95,1],labels=False)/10

然后我创建了一个数据透视表,让我按每个州的 bin 统计人数

df2 = pd.pivot_table(df,index=['bin'],columns='State',values=['Name'],aggfunc=pd.Series.nunique,margins=True)
df2 = df2.fillna(0)

然后我将这些 n 计数转换为百分比并删除边距行

df3 = df2.div(df2.iloc[-1])
df3 = df3.iloc[:-1,:-1]

现在我想用 x 轴上的 bin 和 Y 轴上的百分比创建一个带有多条线(每个州一条)的折线图。 df3.plot() 会给我我想要的图表,但我想使用 matplotlib 完成同样的事情,因为它为我提供了更好的图表定制。 然而,运行

plt.plot(df3)

给了我我需要的台词,但我无法让图例正常工作。 关于如何实现这一点的任何想法?

你可以这样做:

plt.plot(df3,label="label")
plt.legend()
plt.show()

欲了解更多信息,请访问这里

如果它可以帮助您解决问题,请不要忘记将其标记为已接受的答案。

这可能不是最好的方法,但我使用pandas plot函数绘制df3,然后获取图例并获取新标签名称。 请注意,图例字符串的处理仅限于此数据。

line = df3.plot(kind='line')
handles, labels = line.get_legend_handles_labels()
label = []
for l in labels:
    label.append(l[7:-1])

plt.legend(handles, label, loc='best')

在此处输入图片说明

暂无
暂无

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

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