1

我正在尝试制作一个子图网格,其中一个轴跨越两个网格位置。plt.subplots我可以使用、gridspec_kw和轻松实现这一点plt.subplot2grid

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2,3,sharex=True, sharey=True, gridspec_kw={'width_ratios':[1,1,0.8]})
axi = plt.subplot2grid((2,3),(0,2),rowspan=2)
plt.show()

基本设置

但是,我希望右侧的跨轴更窄。当我更改width_ratios为 时[1,1,0.5],我得到了这个:

网格规范错误

其他轴发生了什么?基于这个答案GridSpec,我可以直接使用而不是使用便利包装器来实现我想要的:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

fig = plt.figure()
gs = GridSpec(nrows=2, ncols=3, width_ratios=[1,1,0.5])
ax0 = plt.subplot(gs[0,0])
ax1 = plt.subplot(gs[0,1],sharey=ax0)
ax2 = plt.subplot(gs[1,0],sharex=ax0)
ax3 = plt.subplot(gs[1,1],sharex=ax1,sharey=ax2)
ax4 = plt.subplot(gs[:,2])
[plt.setp(z.get_yticklabels(),visible=False) for z in [ax1,ax3]]
[plt.setp(z.get_xticklabels(),visible=False) for z in [ax0,ax1]]
plt.show()

使用 GridSpec

虽然这可行,但必须手动设置所有内容很乏味,尤其是当我只需两行代码就可以如此接近时。是否有人对如何使用subplots/subplot2grid或我是否坚持这样做很长一段路有想法?这值得在 GitHub 上发布问题报告吗?

4

2 回答 2

1

要报告的问题可能与您想象的不同。我刚刚创建了这个

等效于工作代码GridSpec(这肯定是一个有效且良好的解决方案),可以使用fig.add_subplot而不是plt.subplot2grid从初始网格中删除两个不需要的轴。

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2,3,sharex=True, sharey=True, gridspec_kw={'width_ratios':[1,1,0.8]})
axi = fig.add_subplot(133)

for a in ax[:,2]:
    a.axis("off")
plt.show()
于 2018-06-13T16:44:35.800 回答
1

感谢@ImportanceOfBeingErnest 的回答,我能够弄清楚这一点。在

fig, ax = plt.subplots(2,3,sharex=True, sharey=True, gridspec_kw={'width_ratios':[1,1,0.5]})

轴的宽度根据需要设置。然而,虽然我想要的行为

axi = plt.subplot2grid((2,3),(0,2),rowspan=2)

是跨越现有子图的整个第三列,实际上它创建了一个具有宽度比的虚拟网格,并写入跨越这个新网格右列的轴。由于这个新的右列是图形宽度的 1/3,它与原始子图的中心列的一部分重叠,导致它们消失。2x3[1,1,1]

为了将其保留为两行代码,解决方案是更改subplot2grid调用以模拟所需的宽度比:

axi = plt.subplot2grid((2,5),(0,4),rowspan=2)

width_ratios通过转换原始向量,我得到了 5 列网格:2*[1,1,0.5] = [2,2,1]sum([2,2,1]) = 5. 基本上,由于subplot2grid不知道 in 中width_ratios指定的subplots内容,因此您必须强制它适应新的网格计算。

在此处输入图像描述

于 2018-06-13T18:34:27.493 回答