首页 > 解决方案 > 子图和 twinx 轴

问题描述

我试图制作两个带有 twinx 轴的子图,第一个子图上的 3 条曲线(曲线、曲线 1 和曲线 2)和第二个子图上的 3 条曲线(曲线、曲线 3 和曲线 4)。但我没有得到我想要的。我想知道你们是否可以帮助我。

x = df['curvex']
y = df['curvey']
y1 = df['curve1']
y2 = df['curve2']
y3=df['curve3']
y4=df['curve4']

fig, ax = plt.subplots(figsize=(40,10), dpi=500)

plt.subplot(2,1,1)

fig.subplots_adjust(right=0.75)
twin1 = ax.twinx()
twin2 = ax.twinx()

twin2.spines['right'].set_position(('axes', 1.02))

p1, = ax.plot(x,y, 'bo--', label='curvey', markersize=0.1, linewidth=0.2)
p2, = twin1.plot(x,y1, 'go--', label='curvey1', markersize=0.1, linewidth=0.2)
p3, = twin2.plot(x,y2, 'ro--', label='curvey2', markersize=0.1, linewidth=0.2)
 
ax.set_xlabel('CURVEX')
ax.set_ylabel('CURVEY') 
twin1.set_ylabel('CURVE1')
twin2.set_ylabel('CURVE2')

ax.yaxis.label.set_color(p1.get_color())
twin1.yaxis.label.set_color(p2.get_color())
twin2.yaxis.label.set_color(p3.get_color())

tkw = dict(size=0.5, width=0.2)
ax.tick_params(axis='y', colors=p1.get_color(), **tkw)
twin1.tick_params(axis='y', colors=p2.get_color(), **tkw)
twin2.tick_params(axis='y', colors=p3.get_color(), **tkw)

ax.legend(handles=[p1,p2,p3])



plt.subplot(2,1,2)

fig.subplots_adjust(right=0.75)
twin3 = ax.twinx()
twin4 = ax.twinx()

twin4.spines['right'].set_position(('axes', 1.02))

p1, = ax.plot(x,y, 'bo--', label='curvey', markersize=0.1, linewidth=0.2)
p4, = twin3.plot(x,y3, 'go--', label='curvey4', markersize=0.1, linewidth=0.2)
p5, = twin4.plot(x,y4, 'ro--', label='curvey5', markersize=0.1, linewidth=0.2)
 
ax.set_xlabel('CURVEX')
ax.set_ylabel('CURVEY') 
twin3.set_ylabel('CURVE4')
twin4.set_ylabel('CURVE5')

ax.yaxis.label.set_color(p1.get_color())
twin3.yaxis.label.set_color(p4.get_color())
twin4.yaxis.label.set_color(p5.get_color())

tkw = dict(size=0.5, width=0.2)
ax.tick_params(axis='y', colors=p1.get_color(), **tkw)
twin3.tick_params(axis='y', colors=p4.get_color(), **tkw)
twin4.tick_params(axis='y', colors=p5.get_color(), **tkw)

ax.legend(handles=[p1,p4,p5])

plt.show()

这就是我得到的。对于每个子图,左侧的 Y 轴应分开。Curvey、curve1 和 curve2 应该在第一个子图上,curvey、curve3 和curve4 应该在第二个子图上。总的来说,我想在每个子图中看到 3 条曲线。我也看不到传说。左右的 Y 刻度也是错误的,因为代码不好,我猜

在此处输入图像描述

标签: pythonmatplotlibplotsubplottwinx

解决方案


您的问题可能在于以下几行:

twin1 = ax.twinx()
twin2 = ax.twinx()

错误地,您为同一轴制作双胞胎。将两条子图创建行更改为这一行:

fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(40,10), dpi=500)

之后,您可以执行以下操作:

twin1 = ax1.twinx()
twin2 = ax2.twinx()

另外,不要忘记在开始处理第二个图之前绘制并关闭第一个图:

ax.legend(handles=[p1,p2,p3])
plt.show()
plt.close()

推荐阅读