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值的比率,所以我想知道是否有一个很好的通用方法来设置子图宽度填充空间.可以以某种方式指定子图的物理尺寸吗?我一直在寻找解决方案几个小时,所以提前感谢您提供的任何帮助.
您可以使用该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是相对坐标[左,下,宽,高],其中每个方向按页面大小缩放.
正如在其他答案中指出的那样,imshow并matshow尝试有时将像素保持在图片中.轴比率和轴比有一个相当特殊的相互作用imshow.
imshow在没有extent=[...]或aspect='auto'关键字参数的情况下调用它,它会执行本地默认值中指示的操作,通常会尝试将像素保持为方形aspect='equal'设置),则轴就像plt.axis('scaled')被调用一样,即保持X和Y坐标等长(每单位像素数)并更改轴大小以匹配范围plt.axis('tight')(这使得x和y限制恰好适合图像)个老伎俩是使用axis('auto')或axis('normal'),但这些都是时下弃用(使用scaled,equal或tight).
是的,这有点乱.
首先,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)
在我的系统上,它看起来像这样:

| 归档时间: |
|
| 查看次数: |
13665 次 |
| 最近记录: |