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

时间:2014-04-05 13:08:13

标签: python matplotlib

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

import matplotlib.pyplot as plt

ax = plt.subplot(111)
ax.change_geometry(3,1,1)

将轴放在最上面的三行上。但是我想让轴跨越前两排。我试过这个:

import matplotlib.gridspec as gridspec

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

但轴仍然在整个窗口。

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

3 个答案:

答案 0 :(得分:10)

感谢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()

答案 1 :(得分:4)

您可以使用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()

enter image description here

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

ax1.set_position([0.1,0.1, 0.5, 0.5])

你不需要这个来创建你描述的数字。

答案 2 :(得分:1)

您可以使用ax.set_position()代替重新计算新的gridspec来避免fig.tight_layout()

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

# create the first axes without knowing of further subplot creation
fig, ax = plt.subplots()
ax.plot(range(5), 'o-')

# now update the existing gridspec ...
gs = gridspec.GridSpec(3, 1)
ax.set_subplotspec(gs[0:2])
# ... and recalculate the positions
fig.tight_layout()

# add a new subplot
fig.add_subplot(gs[2])
fig.tight_layout()
plt.show()