Matplotlib的轴线外框由三个因素控制:
- 轴线在图中的边界框(由subplot规范或特定范围控制,例如
fig.add_axes([left, bottom, width, height])
)。轴线限制(不包括刻度标签)将始终在此框内。
adjustable
参数控制着通过更改数据限制或轴线“框”的形状来适应于限制或纵横比的变化。这可以是"datalim"
、"box"
或"box-forced"
。(后者用于共享轴。)
- 轴线限制和纵横比。对于具有固定纵横比的情况,轴线框或数据限制(取决于
adjustable
)将更改以维护指定的纵横比。纵横比指的是数据坐标,而不是轴线直接的形状。
对于最简单的情况:
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2)
data = np.random.random((3,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,3)
axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')
axes[1].set_aspect(1)
plt.show()
![输入图像描述](https://istack.dev59.com/fDxoF.webp)
共享坐标轴
但是,如果你想确保它始终保持相同的形状,并且同时使用相同的数据限制,可以这样做:
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2), sharex=True, sharey=True)
plt.setp(axes.flat, adjustable='box-forced')
data = np.random.random((5,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,5)
axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')
axes[1].plot([-0.5, 2.5], [-0.5, 4.5])
axes[1].set_aspect(1)
plt.show()
![enter image description here](https://istack.dev59.com/aE9aq.webp)
然而,您可能会注意到这看起来不太对。这是因为由于我们绘制图形的顺序,第二个子图正在控制第一个子图的范围。
基本上,使用共享坐标轴,无论我们最后绘制什么都将控制最初的范围,所以如果我们只是交换绘制的顺序:
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, sharex=True, sharey=True)
plt.setp(axes.flat, adjustable='box-forced')
data = np.random.random((5,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,5)
axes[1].plot([-0.5, 2.5], [-0.5, 4.5])
axes[1].set_aspect(1)
axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')
plt.show()
![enter image description here](https://istack.dev59.com/IVzy2.webp)
当然,如果您不关心图表的交互式缩放/平移是否链接,则可以完全跳过共享轴,并仅执行以下操作:
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2)
data = np.random.random((5,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,5)
axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')
axes[1].plot([-0.5, 2.5], [-0.5, 4.5])
axes[1].set_aspect(axes[0].get_aspect())
axes[1].axis(axes[0].axis())
plt.show()
非共享轴
如果您不希望两个轴具有相同的数据范围,可以强制它们具有相同的大小(尽管如果您进行交互式缩放,则它们将不会链接)。为此,您需要根据第一个绘图的范围和范围/纵横比计算第二个绘图的纵横比。
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2)
data = np.random.random((3,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,3)
axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')
axes[1].plot(np.linspace(0, 10, 100), np.random.normal(0, 1, 100).cumsum())
aspect0 = axes[0].get_aspect()
if aspect0 == 'equal':
aspect0 = 1.0
dy = np.abs(np.diff(axes[1].get_ylim()))
dx = np.abs(np.diff(axes[1].get_xlim()))
aspect = aspect0 / (float(dy) / dx)
axes[1].set_aspect(aspect)
plt.show()
![enter image description here](https://istack.dev59.com/pOD3f.webp)
fig.add_axes([left, bottom, width, height])
。我将尝试弄清楚并回复以获得自己的赏金 :)。 - mankoff