我有一个数据框,例如:
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 $的哪个值。
这样做的正确方法是什么?
答案 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()
两者都创建了以下图:
使用的数据:
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