Matplotlib:获取子图填充数字

Pet*_*erW 5 python matplotlib subplot

我想请求如何在将图像绘制为子图时覆盖默认的matplotlib行为的建议,其中子图大小似乎与图形大小不匹配.我想设置我的图形尺寸(例如,以匹配A4页面的宽度)并使子图自动拉伸以填充可用空间.在下面的示例中,下面的代码给出了一个在面板之间有很多空白区域的图形:

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()
Run Code Online (Sandbox Code Playgroud)

我希望子图可以水平拉伸,以便填充图形空间.我将在每个轴上制作许多具有不同数值的相似图,并且图之间的空间似乎取决于x值与y值的比率,所以我想知道是否有一个很好的通用方法来设置子图宽度填充空间.可以以某种方式指定子图的物理尺寸吗?我一直在寻找解决方案几个小时,所以提前感谢您提供的任何帮助.

DrV*_*DrV 7

您可以使用该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()
Run Code Online (Sandbox Code Playgroud)

现在轴区域(绘图区域)填满整个页面.

给定的坐标set_position是相对坐标[左,下,宽,高],其中每个方向按页面大小缩放.

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

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

个老伎俩是使用axis('auto')axis('normal'),但这些都是时下弃用(使用scaled,equaltight).

是的,这有点乱.

  • 我喜欢使用“模糊单位”来表示英寸。也很对。 (3认同)

Pau*_*l H 6

首先,plt当你有Axes对象作为你的处置时,你正在使用调用。那条路通向痛苦。其次,imshow将轴比例的纵横比设置为 1。这就是轴如此窄的原因。知道所有这些,你的例子变成:

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, axes = plt.subplots(1, 2, figsize=(9,3))  

for ax in axes.flatten():  # flatten in case you have a second row at some point
    img = ax.imshow(data, interpolation='nearest')
    ax.set_aspect('auto')

plt.colorbar(img)
Run Code Online (Sandbox Code Playgroud)

在我的系统上,它看起来像这样: 在此处输入图片说明