Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matplotlib subplot2grid在设置gridspec_kw width_比率时删除子地块_Matplotlib - Fatal编程技术网

Matplotlib subplot2grid在设置gridspec_kw width_比率时删除子地块

Matplotlib subplot2grid在设置gridspec_kw width_比率时删除子地块,matplotlib,Matplotlib,我正在尝试制作一个包含子地块的网格,其中一个轴跨越两个网格位置。我可以通过plt.subplot、gridspec\u 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),ro

我正在尝试制作一个包含子地块的网格,其中一个轴跨越两个网格位置。我可以通过
plt.subplot
gridspec\u 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()

但是,我希望右侧的跨越轴更窄。当我将
宽度\u比率
更改为
[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()


虽然这是可行的,但是手动设置一切都是很乏味的,尤其是当我只需要两行代码就可以完成的时候。有没有人想过如何使用
子绘图
/
子绘图2网格
来完成这项工作,或者我一直在做这项工作?这值得在GitHub上做一个问题报告吗?

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

工作代码与
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()
多亏了你,我才明白这一点。在

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)
要跨越现有子地块的整个第三列,实际上它创建了一个新的虚拟
2x3
网格,其宽度比
[1,1,1]
,并写入跨越此新网格右列的轴。因为这个新的右栏是地物宽度的1/3,所以它与原始子地块的中心栏部分重叠,导致它们消失

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

axi = plt.subplot2grid((2,5),(0,4),rowspan=2)
我通过转换原始的
width\u比率
vector:
2*[1,1,0.5]=[2,2,1]
sum([2,2,1])=5,得到了网格的5列。基本上,由于
subplot2grid
不知道
subplots
中指定的
width\u比率
,因此必须强制它与新的网格计算相适应


这是可行的,但需要调整。问题在于
fig.add_子图(133)
基于整个图形生成规则网格,因此忽略了gridspec宽度比。如果您将
宽度\u比率
更改为
[1,1,2]
[1,1,0.3]
,您就会明白我的意思。为了使此方法起作用,例如在
width\u ratio=[1,1,0.5]
的情况下,您必须计算
子批次
调用的值,以便所有内容都对齐。在这种情况下,它将是
fig.add_子图(155)
,因为
2*[1,1,0.5]=[2,2,1]
sum([2,2,1])=5
。我将接受此更新的答案!当然,如果你需要的话,请随时更新答案。我刚刚意识到我对你答案的建议实际上适用于我原来的问题,所以我将只做一个新的答案。谢谢你的帮助!