考虑到 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
中的级别相匹配)的离散级别。
我想用一个颜色条绘制两个子图的图形。但是,这两个子图位于不同的范围内。我尝试使用 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
中的级别相匹配)的离散级别。