我正在尝试制作一个子图的网格,其中一个轴跨越两个网格位置。我可以使用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]
时,我明白这一点:
其他轴发生了什么变化?基于this answer,我可以直接使用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()
虽然这有效,但必须手动设置所有内容,特别是当我只用两行代码就可以如此接近时,这是很繁琐的。有没有人想过如何使用subplots
/ subplot2grid
来完成这项工作,还是我坚持不懈地做这件事?这值得关于GitHub的问题报告吗?
答案 0 :(得分:1)
要报告的问题可能与您想象的不同。我刚刚创建了this one。
与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()
答案 1 :(得分:1)
感谢the answer of @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)
是跨越现有子图的整个第三列,实际上它会创建宽度比为2x3
的新虚拟[1,1,1]
网格并写入跨越此新网格右列的轴。由于这个新的右列是图形宽度的1/3,它与原始子图的中心列的一部分重叠,导致它们消失。
为了将此代码保留为两行代码,解决方案是更改subplot2grid
调用以模拟所需的宽度比:
axi = plt.subplot2grid((2,5),(0,4),rowspan=2)
我通过转换原始width_ratios
向量2*[1,1,0.5] = [2,2,1]
和sum([2,2,1]) = 5
来获得网格的5列。基本上,由于subplot2grid
不知道width_ratios
中指定的subplots
,因此您必须强制它适应新的网格计算。