Python Colorbar附加到现有轴,而不是填充到其中

Python Colorbar附加到现有轴,而不是填充到其中,python,matplotlib,Python,Matplotlib,这个问题有点难以描述,但很容易表现出来。我创建了一个带有子图的网格,其中右栏由一个高个子图(大致如下)填充,我想用它作为色条。创建一个给定大小的新轴并将其用于色条是在许多代码示例中完成的(例如,请参见),但它不适用于我 下面是一个打印布局与真实打印相同的示例,再现了问题: import matplotlib.pyplot as plt import matplotlib.colors as clt import numpy as np fig, axes = plt.subplots(3, 2

这个问题有点难以描述,但很容易表现出来。我创建了一个带有子图的网格,其中右栏由一个高个子图(大致如下)填充,我想用它作为色条。创建一个给定大小的新轴并将其用于色条是在许多代码示例中完成的(例如,请参见),但它不适用于我

下面是一个打印布局与真实打印相同的示例,再现了问题:

import matplotlib.pyplot as plt
import matplotlib.colors as clt
import numpy as np

fig, axes = plt.subplots(3, 2, figsize=(15,8), tight_layout=True,
                         gridspec_kw={'width_ratios': [1, 0.02],
                                      'height_ratios': [2, 1, 1]})

x, y = np.random.rand(500000), np.random.rand(500000)
counts, xedges, yedges, im = axes[0, 0].hist2d(x, y, bins=(149, 336), norm=clt.LogNorm(), cmap='inferno_r')
axes[1, 0].plot(np.random.rand(2184))
axes[2, 0].plot(np.random.rand(2184))

gs = axes[0, 1].get_gridspec()
for ax in axes[:, 1]:
    ax.remove()
axbig = fig.add_subplot(gs[0:, -1])
bar = fig.colorbar(im, ax=axbig)

axes[0, 0].set_ylabel("2D histogram")
axes[1, 0].set_ylabel("unrelated data")
axes[2, 0].set_ylabel("other unrelated")
bar.set_label("colourbar")
(请注意,我使用
add_子图(gs[0:,-1])
来创建高个子图,但类似
add_轴([0.8,0.1,0.03,0.8])
的效果相同)

以及输出:

请注意,色条是如何作为一个微小的新轴添加到我为其创建的现有轴上的。我希望它能够填充现有的轴,如中所示。怎么了?我正在使用python 3.8从spyder 5.0.0内部运行matplotlib 3.3.1。

您最初的问题是,您不希望三个轴中的一个轴被压扁,这一问题通过受约束的\u布局得到了明确解决

我认为人们出于某种原因被CL指南上的警告吓跑了,但这确实适用于那些运行生产代码的人,他们每次运行的代码必须是相同的像素。对于大多数用户来说,CL是比紧凑布局更好的选择

导入matplotlib.pyplot作为plt
将matplotlib.colors导入为MCOLOR
将numpy作为np导入
图,axs=plt.子批次(3,1,figsize=(7,4),约束的布局=True,
gridspec_kw={'height_ratio':[2,1,1]})
x、 y=np.random.rand(500000),np.random.rand(500000)
res=axs[0].hist2d(x,y,bin=(149336),
norm=mcolors.LogNorm(),cmap='inferno\u r')
axs[1].绘图(np.random.rand(2184))
axs[2].绘图(np.random.rand(2184))
图颜色条(res[3],ax=axs[0])
plt.show()

就上下文而言,我之所以绘制这样一个图,是因为所有子图都共享其x轴(这是一个时间序列),但都是不相关的数据集。我希望它们具有完全相同的宽度,以便它们在视觉上水平排列,因此我将色条放在它们旁边以实现这一点。如果我只把色条放在最上面的子图上,它就会得到。你需要使用
cax=
而不是
fig.colorbar(im,cax=axbig)
中的
ax=
ax=
是色条应该“窃取”一些空间的子地块。当给出
cax=
时,不需要“窃取”。是的,但不要制作颜色条轴。只需通过fig.colorbar(im,ax=轴),它就会放在所有三个轴的右边。@JodyKlymak确实如此@JohanC Yep就这么简单。老实说,我不知道
ax
cax
是不同的参数,我以为我在某些地方看到了拼写错误。干杯:)