我想就如何在将图像绘制为子图时覆盖默认的 matplotlib 行为提出建议,子图大小似乎与图形大小不匹配。我想设置我的图形大小(例如匹配 A4 页面的宽度)并让子图自动拉伸(stretch)以填充可用空间。在下面的示例中,下面的代码给出了一个面板之间有很多空白的图形:
import numpy as np
import matplotlib.pyplot as plt
data=np.random.rand(10,4)
#creating a wide figure with 2 subplots in 1 row
fig,ax=plt.subplots(1,2, figsize=(9,3))
ax=ax.reshape(1,len(ax))
for i in [0,1]:
plt.sca(ax[0,i])
plt.imshow(data,interpolation='nearest')
plt.colorbar()
我希望子图水平拉伸(stretch),以便它们填充图形空间。我将沿每个轴制作许多具有不同数量值的类似图,并且图之间的空间似乎取决于 x 值与 y 值的比率,所以我想知道是否有一个好的通用设置方法填充空间的子图宽度。可以以某种方式指定子图的物理大小吗?几个小时以来,我一直在寻找解决方案,因此在此先感谢您提供的任何帮助。
最佳答案
您可以使用 ax.set_position
方法调整轴区域。它使用相对坐标,所以如果你想制作一张 A4 图像,那么:
import numpy as np
import matplotlib.pyplot as plt
# figsize keyword talks some obscure units which need a conversion from standard units
plt.figure(figsize=np.array([210,297]) / 25.4)
x = np.linspace(0,2*np.pi, 100)
plt.plot(x, np.sin(x))
plt.gca().set_position([0, 0, 1, 1])
plt.show()
现在轴区域(绘图区域)填满了整个页面。
提供给 set_position
的坐标是相对坐标 [left, lower, width, height],其中每个方向都按页面大小缩放。
正如其他答案中所指出的,imshow
和 matshow
有时会尝试将像素保持在图片正方形中。轴比和 imshow
有一个相当特殊的相互作用。
- 如果调用
imshow
时没有使用extent=[...]
或aspect='auto'
关键字参数,它会按照指示执行在本地默认情况下,通常会尝试保持像素正方形 - 如果发生这种情况(或设置了
aspect='equal'
),轴的行为就像调用了plt.axis('scaled')
一样,即保持X 和 Y 坐标长度相等(每单位像素)并更改轴大小以匹配范围 - 这可以通过设置
plt.axis('tight')
来覆盖(这使得 x 和 y 限制完全适合图像)
旧技巧是使用 axis('auto')
或 axis('normal')
,但现在已弃用(使用 scaled
code>、equal
或 tight
)。
是的,有点乱。
关于python - Matplotlib:获取子图以填充图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535393/