将数据框绘制为多个线图

时间:2017-02-16 13:47:31

标签: python pandas matplotlib

我有一个数据框,例如:

   x   y   z
   1   1   100
   1   2   150
   1   3   200
   2   1   125
   2   2   175
   2   3   225
   3   1   225
   3   2   275
   3   3   325
   ...

我想在$ x $的每个值上在同一图表上绘制$ z $作为$ y $的函数。所以会有一个$ x = 1 $的情节,$ x = 2 $的情节,$ x = 3 $的情节等等。

我试过了:

ax = df[df['x']==1].plot(x='y',y='x', title='x==1')
df[df['x']==2].plot(x='y',y='x', title='x==2', ax=ax)
df[df['x']==3].plot(x='y',y='x', title='x==3', ax=ax)

这确实使3个正确的图形,但是,它们在图例上都被称为相同,所以我不知道哪个线图属于$ x $的哪个值。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

(选项I): 遍历分组对象的子组并在同一轴上绘图,ax

ax = plt.gca()                     # get current axes to plot against
for num, g in df.groupby('x'):
    g.plot(x='y', y='z', ax=ax, label="x=={}".format(num))
# plt.ylabel("z")                  # to display y-axis label
plt.show()

(选项II): 以相同的顺序将 y x 设置为索引轴。取消堆叠,以便 x 成为列。使用add_prefix修改列名称,以便以这种方式格式化图例。将列的name属性设置为None,最后绘制。

df.set_index(['y', 'x'])['z'].unstack().add_prefix("x==").rename_axis(None, axis=1).plot()

两者都创建了以下图:

enter image description here

使用的数据:

np.random.seed(42)
df = pd.DataFrame(dict(x=np.repeat([1,2,3], 3),
                       y=np.tile([1,2,3], 3),
                       z=np.random.randint(100,500,9)))
df

enter image description here