创建轴后更改matplotlib子图大小/位置

Rut*_*thC 17 python matplotlib

是否可以在创建轴后设置matplotlib子图的大小/位置?我知道我能做到:

import matplotlib.pyplot as plt

ax = plt.subplot(111)
ax.change_geometry(3,1,1)
Run Code Online (Sandbox Code Playgroud)

把轴放在三排的顶行.但是我想让轴跨越前两排.我试过这个:

import matplotlib.gridspec as gridspec

ax = plt.subplot(111)
gs = gridspec.GridSpec(3,1)
ax.set_subplotspec(gs[0:2])
Run Code Online (Sandbox Code Playgroud)

但轴仍然填满了整个窗口.

为清晰起见, 我想更改现有轴实例的位置,而不是在创建它时设置它.这是因为每次添加数据时都会修改轴的范围(使用cartopy在地图上绘制数据).地图可能变得高而窄,或短而宽(或介于两者之间).因此,在绘图功能之后将决定网格布局.

Rut*_*thC 12

感谢Molly指出我正确的方向,我有一个解决方案:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure()

ax = fig.add_subplot(111)

gs = gridspec.GridSpec(3,1)
ax.set_position(gs[0:2].get_position(fig))
ax.set_subplotspec(gs[0:2])              # only necessary if using tight_layout()

fig.add_subplot(gs[2])

fig.tight_layout()                       # not strictly part of the question

plt.show()
Run Code Online (Sandbox Code Playgroud)

  • 这里重要的是“1)”创建一个具有预期布局的新“GridSpec”实例,因为它的行数或列数无法更新(即使使用其“update()”方法);`2)` 调用 `ax.set_position(gs[0:2].get_position(fig))` 来调整大小;调用“set_subplotspec”仅创建引用,并且不更新位置。 (3认同)

Mol*_*lly 5

您可以使用subplot2gridrowspan参数创建一个具有一个跨两行的子图和一个跨一行的子图的图形

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = plt.subplot2grid((3,1), (0,0), rowspan=2)
ax2 = plt.subplot2grid((3,1), (2,0))
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果要在创建子图后更改其大小和位置,可以使用set_position方法。

ax1.set_position([0.1,0.1, 0.5, 0.5])
Run Code Online (Sandbox Code Playgroud)

Bu您不需要此来创建您描述的图形。