Matplotlib 如何在子图之间共享二次y轴
在matplotlib中,我们可以在同一图中绘制多个子图,这些子图共享相同的x轴或y轴,这对于比较多个数据集时非常有用。但是,在某些情况下,除了共享主要的x轴或y轴之外,我们还需要共享次要的y轴。这时,就需要使用matplotlib的“twinx()”和“twiny()”函数。
阅读更多:Matplotlib 教程
使用twinx()和twiny()函数
使用twinx()和twiny()函数的方法非常简单。当我们绘制第一个子图时,我们需要使用“ax.twinx()”或“ax.twiny()”函数创建另一个y轴或x轴。然后,我们可以使用“ax.plot()”函数,对第一个子图和新创建的子图进行绘制和设置。
以下是示例代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(x, y1, 'g-', label='sin(x)')
ax2.plot(x, y2, 'b-', label='cos(x)')
ax1.set_xlabel('X data')
ax1.set_ylabel('sin(x) data', color='g')
ax2.set_ylabel('cos(x) data', color='b')
plt.show()
在上面的代码中,我们首先从numpy中导入所需的函数和一些数据。然后,我们使用“plt.subplots()”函数创建了一个包含主要y轴的子图(ax1),并使用“ax1.twinx()”方法创建了一个附加的次要y轴(ax2)。接下来,我们使用“ax1.plot()”和“ax2.plot()”函数绘制了两个数据集,分别使用不同的颜色显示。最后,我们使用“ax1.set_xlabel()”、“ax1.set_ylabel()”和“ax2.set_ylabel()”函数为每个轴添加标签。
共享轴
在上面的示例中,主要y轴和次要y轴的范围是不同的。为了共享次要y轴,我们需要确保两个y轴具有相同的范围。我们可以通过使用“ax2.set_ylim()”方法或“ax2.get_ylim()”方法来实现这一点。此外,我们还可以使用“ax1.set_ylim()”和“ax1.get_ylim()”方法来设置主要y轴的范围。
以下是示例代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = 2*np.tan(x)
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(x, y1, 'g-', label='sin(x)')
ax2.plot(x, y2, 'b-', label='cos(x)')
ax2.plot(x, y3, 'r-', label='2*tan(x)')
ax1.set_xlabel('X data')
ax1.set_ylabel('sin(x) data', color='g')
ax2.set_ylabel('cos(x) and 2*tan(x) data', color='b')
lim1 = ax1.get_ylim()
lim2 = ax2.get_ylim()
ymin = min(lim1[0], lim2[0])
ymax = max(lim1[1], lim2[1])
ax1.set_ylim(ymin, ymax)
ax2.set_ylim(ymin, ymax)
plt.show()
在上面的代码中,我们使用“y3 = 2*np.tan(x)”创建了一个新的数据集,并将其添加到了次要y轴中。然后,我们使用“ax1.get_ylim()”和“ax2.get_ylim()”方法获取主要y轴和次要y轴的范围。接下来,我们使用“min()”函数和“max()”函数来计算整个y轴的范围,并使用“ax1.set_ylim()”和“ax2.set_ylim()”设置主要y轴和次要y轴的范围相同。
共享二次y轴的子图
如果我们想要在多个子图中共享二次y轴,我们需要使用不同的方法。在这种情况下,我们需要使用“plt.subplots()”函数创建子图网格,并将其传递给每个子图。然后,我们需要在每个子图中创建主要的y轴和次要的y轴,并确保它们共享相同的范围。
以下是示例代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True, sharey='row')
ax1.plot(x, y1, 'g-', label='sin(x)')
ax2.plot(x, y2, 'b-', label='cos(x)')
ax3.plot(x, y3, 'r-', label='tan(x)')
ax4.plot(x, y1+y2+y3, 'm-', label='sum')
ax1.set_ylabel('sin(x) data', color='g')
ax2.set_ylabel('cos(x) data', color='b')
ax1.tick_params(axis='y', labelcolor='g')
ax2.tick_params(axis='y', labelcolor='b')
ax3.set_xlabel('X data')
ax3.set_ylabel('tan(x) data', color='r')
ax3.tick_params(axis='y', labelcolor='r')
ax4.set_xlabel('X data')
ax4.set_ylabel('sum of sin(x), cos(x) and tan(x)', color='m')
ax4.tick_params(axis='y', labelcolor='m')
lim1 = ax1.get_ylim()
lim2 = ax2.get_ylim()
lim3 = ax3.get_ylim()
ymin = min(lim1[0], lim2[0], lim3[0])
ymax = max(lim1[1], lim2[1], lim3[1])
ax1.set_ylim(ymin, ymax)
ax2.set_ylim(ymin, ymax)
ax3.set_ylim(ymin, ymax)
plt.show()
在上面的代码中,我们首先创建一个包含四个子图的网格,使用“sharex=True”和“sharey=’row’”参数共享主要x轴和二次y轴。然后,我们在每个子图中创建主要y轴和次要y轴,并对每个数据集进行绘制和设置。对于行方向上的每个子图,我们确保它们共享相同的y轴,并使用“min()”函数和“max()”函数计算所有三个y轴的范围,以确保它们的次要y轴共享相同的范围。
总结
使用“twinx()”和“twiny()”函数,我们可以在matplotlib中绘制共享二次y轴的子图。我们可以使用“get_ylim()”和“set_ylim()”函数设置次要y轴的范围,以确保多个子图共享相同的次要y轴。在绘制多个子图时,我们需要使用“sharex=True”和“sharey=’row’”参数确保它们共享主要x轴和二次y轴。
极客教程