matplotlib 坐标轴的轮廓由三个东西控制:
- 图中的坐标区边界框(由子图规范或特定范围控制,例如
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()
共享轴
但是,如果您想确保它无论如何都保持相同的形状,并且您可以接受两个具有相同数据限制的图,您可以这样做:
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()
但是,您可能会注意到这看起来不太正确。这是因为第二个子图控制着第一个子图的范围,这是因为我们绘制的顺序。
基本上,对于共享轴,我们最后绘制的任何内容都将控制初始范围,所以如果我们只是交换我们绘制的顺序:
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()
当然,如果您不关心被链接的绘图的交互式缩放/平移,您可以完全跳过共享轴,然后:
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])
# Copy extents and aspect from the first axes...
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())
# Calculate the proper aspect for the second axes
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()