考虑到 2 个不同范围子图中的单个颜色条,pcolor 和 contourf 的颜色条有什么区别

what's the difference between the colorbar of pcolor and contourf, considering a single colorbar in 2 different range subplots

我想用一个颜色条绘制两个子图的图形。但是,这两个子图位于不同的范围内。我尝试使用 contourf 来制作它,但失败了。 contourf 的颜色条总是显示在最后一个子图的范围内,但我需要的是在两个子图范围内的颜色条。我在没有修改任何其他代码的情况下将 contourf 更改为 pcolor 并最终成功了。我的灵感来自 link: Set Colorbar Range in matplotlib 因此,我对什么有效以及为什么有效感到困惑。附上代码

fig, axes = plt.subplots(nrows=1, ncols=2)
j = 0
for ax in axes.flat:
    if j == 0:
        Z = sensi_n_M(X,Y,n)
        varName = 'vegetation coverage'
        label = 'dM/M'
    elif j == 1:
        Z = sensi_n_AS(X,Y,n)
        varName = 'average slope'
        label = r'{dtan\beta/tan\beta}'
    title1 = ax.set_title(r'$\frac{dn/n}{'+label+'}$'+'\n', fontsize=25)
    ylabel=ax.yaxis.set_label_text('average slope')
    ylabel.set_fontsize(15)
    xlabel=ax.xaxis.set_label_text('vegetation coverage')
    xlabel.set_fontsize(15)
    for tick in ax.xaxis.get_major_ticks():  
            tick.label1.set_fontsize(10)
    for tick in ax.yaxis.get_major_ticks():  
            tick.label1.set_fontsize(10)
    fill = ax.pcolor(X, Y, Z, #rstride=1, cstride=1, #clevs,
                     #edgecolors = 'r',
                   cmap=plt.cm.RdBu_r,vmin=-2.4,vmax=1.2)
    j = j+1
v = np.linspace(-2.4,1.2,13)
fig.subplots_adjust(left=0.2, wspace=0.8, top=0.8)
cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
cb = fig.colorbar(fill, cax=cax)
cb.set_ticklabels(v)
plt.show()

下图是pcolor

不过下图是关于contourf

contourf 图的代码是:

fig, axes = plt.subplots(nrows=1, ncols=2)
j = 0
for ax in axes.flat:
    if j == 0:
        Z = sensi_n_M(X,Y,n)
        varName = 'vegetation coverage'
        label = 'dM/M'
    elif j == 1:
        Z = sensi_n_AS(X,Y,n)
        varName = 'average slope'
        label = r'{dtan\beta/tan\beta}'
    title1 = ax.set_title(r'$\frac{dn/n}{'+label+'}$'+'\n', fontsize=25)
    ylabel=ax.yaxis.set_label_text('average slope')
    ylabel.set_fontsize(15)
    xlabel=ax.xaxis.set_label_text('vegetation coverage')
    xlabel.set_fontsize(15)
    for tick in ax.xaxis.get_major_ticks():  
            tick.label1.set_fontsize(10)
    for tick in ax.yaxis.get_major_ticks():  
            tick.label1.set_fontsize(10)
    fill = ax.contourf(X, Y, Z, rstride=1, cstride=1, #clevs,
                     #edgecolors = 'r',
                   cmap=plt.cm.RdBu_r,vmin=-2.4,vmax=1.2)
    j = j+1
v = np.linspace(-2.4,1.2,13)
fig.subplots_adjust(left=0.2, wspace=0.8, top=0.8)
cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
cb = plt.colorbar(fill, cax=cax)
cb.set_ticklabels(v)
plt.show()

如果您问为什么其中一个似乎是补丁,而另一个似乎更连续,那是有意为之,并且取决于您输入的是哪种可映射对象以从中绘制颜色条。

See source code here, basically it checks if the mappable is a counterset, if so it will draw a ColorbarPatch, otherwise draw a normal Colorbar. A few lines above that 你可以看到 ColorbarPatch class 基本上是从 Colorbar class 扩展而来的,并且本质上是在一组中绘制颜色条通过覆盖 _add_solids 方法(这又与您作为可映射参数提供的 ContourSet 中的级别相匹配)的离散级别。