matplotlib 共享子图x轴

50few1ms  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(150)

经过 * 很多 * 的战斗和观看youtube教程,我已经能够实现我的目标,创造一个数字窗口,一个独特的名称和4个子情节。
我使用的方法是add_subplot,因为我更好地理解代码,而不是解包元组方法,即图,.
最后一点,我试图做的是分享我的x轴,经过大量的发挥,即试图插入代码sharex="Cols"sharex = True,我没有成功。
我的完整代码如下:

import pandas
import numpy
from matplotlib import pyplot

x = numpy.linspace(0, 2*numpy.pi, 400)
y = numpy.sin(x**2)
yy = numpy.sin(x**2+3)

My_Figure_Window = pyplot.figure("Title Of Figure Window")
pyplot.style.use("ggplot")
My_Figure_Window.suptitle("Main Title")

Sub_Plot_Rows = 4
Sub_Plot_Cols = 1

Wall = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 1)
Wall.plot(x, y, color="r", label='Line 1')
Wall.plot(x, yy, color="b", label='Line 2')
pyplot.ylabel("Ylabel")
Wall.get_legend_handles_labels()
pyplot.legend()
pyplot.show()

Sidewalk = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 2)
Sidewalk.plot(x, y, label='Line 3')
Sidewalk.plot(x, yy, label='Line 4')
pyplot.ylabel("Ylabel")
Sidewalk.get_legend_handles_labels()
pyplot.legend()
pyplot.show()

HeadWall = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 3)
HeadWall.plot(x, y, label='Line 5')
HeadWall.plot(x, yy, label='Line 6')
pyplot.ylabel("Ylabel")
HeadWall.get_legend_handles_labels()
pyplot.legend()
pyplot.show()

SideTank = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 4)
SideTank.plot(x, y, label='Line 7')
SideTank.plot(x, yy, label='Line 8')
pyplot.ylabel("Ylabel")
SideTank.get_legend_handles_labels()
pyplot.legend()
pyplot.show()

字符串
有没有人能给我指出正确的方向,告诉我在哪里/如何共享所有这些子图的X轴?
顺便说一下,我已经意识到代码pyplot.show()没有任何影响,但每个人都包括它?

yr9zkbsy

yr9zkbsy1#

使用matplotlib有两种主要方式。第一种是pyplot“有状态”API,您可以在其中进行类似pyplot.legend()的调用,另一种是面向对象的API,您可以在其中进行类似`SideTank.get_handles_labels()的调用。这两种方式都很好,但混合使用它们有时会导致混淆。这就是您的情况下的问题。例如,

SideTank.get_legend_handles_labels()
pyplot.legend()

字符串
第一个调用是OO API的一部分,第二个是pyplot调用。如果您使用OO API,则可能需要使用SideTank.legend(),如果您使用Pyplot API,则可能需要使用pyplot.legend()
如果你想使用pyplot API:

如果你想使用OO API:

以下是实现孪生轴的几种方法:

# This will create a Figure and a list of 4 axes objects. All of those axes objects will have sharex X axes
figure, axes = pyplot.subplots(nrows=4, sharex=True)

axes[0].plot((0, 1), (0, 1))
axes[1].plot((0, 2), (0, 1))
axes[2].plot((0, 0.5), (0, 1))
axes[3].plot((1, 1.5), (0, 1))
# Create a figure
fig = pyplot.figure()

# Use that figure to create a first subplot
ax1 = fig.add_subplot(4, 1, 1)
# Make the following subplots twin that subplot's x axis.
ax2 = fig.add_subplot(4, 1, 2, sharex = ax1)
ax3 = fig.add_subplot(4, 1, 3, sharex = ax1)
ax4 = fig.add_subplot(4, 1, 4, sharex = ax1)

ax1.plot((0, 1), (0, 1))
ax2.plot((0, 2), (0, 1))
ax3.plot((0, 0.5), (0, 1))
ax4.plot((1, 1.5), (0, 1))

的数据
如果你想使用pyplot API,它看起来像这样。

# Create a current figure and subplot
pyplot.figure()
pyplot.subplot(4, 1, 1)

# Plot something in the current subplot
pyplot.plot((0, 1), (0, 1))

# short for "get current axes"
# This returns an Axis, so we're dipping into the OO API; it's not uncommon to need to
# do that to do more advanced things, but it's a signal to be careful!
share_handle = pyplot.gca() 

# Select a new subplot, and tell it to share its x axis with the first subplot.
pyplot.subplot(4, 1, 2, sharex = share_handle)
pyplot.plot((0, 2), (0, 1))

pyplot.subplot(4, 1, 3, sharex = share_handle)
pyplot.plot((0, 0.5), (0, 1))

pyplot.subplot(4, 1, 4, sharex = share_handle)
pyplot.plot((1, 1.5), (0, 1))


所有这些都将创建如下内容:


的数据
关于你的第二个问题,pyplot.show()显示的是 figures 而不是subplots。因此,你可能只想调用一次,当你完成了整个图的设置。

相关问题