python - Matplotlib:获取子图以填充图形

标签 python matplotlib subplot

我想就如何在将图像绘制为子图时覆盖默认的 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],其中每个方向都按页面大小缩放。

正如其他答案中所指出的,imshowmatshow 有时会尝试将像素保持在图片正方形中。轴比和 imshow 有一个相当特殊的相互作用。

  • 如果调用 imshow 时没有使用 extent=[...]aspect='auto' 关键字参数,它会按照指示执行在本地默认情况下,通常会尝试保持像素正方形
  • 如果发生这种情况(或设置了 aspect='equal'),轴的行为就像调用了 plt.axis('scaled') 一样,即保持X 和 Y 坐标长度相等(每单位像素)并更改轴大小以匹配范围
  • 这可以通过设置 plt.axis('tight') 来覆盖(这使得 x 和 y 限制完全适合图像)

旧技巧是使用 axis('auto')axis('normal'),但现在已弃用(使用 scaled code>、equaltight)。

是的,有点乱。

关于python - Matplotlib:获取子图以填充图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535393/

相关文章:

python - Django - 复杂的嵌套列表和元组解包

python - matplotlib 错误栏可以设置线条样式吗?

python - 在 matplotlib 中操作 x 轴刻度标签

python - Pycharm - 导入 Matplotlib

python - pandas 0.21.0 时间戳与 matplotlib 的兼容性问题

matplotlib - sharey ='row' 和 sharey ='True' 的区别

python - 如何将 httplib 调试器信息设置为记录器调试级别

python - 使用 pandas.Dataframe.plot 将条形子图颜色调整为红色(负)和绿色(正)

python - 有没有办法在 Python 中使用 subplot2grid 制作本地标题

python - MacOS Sierra 后 Django 测试速度变慢