В чем разница между цветовой шкалой pcolor и contourf, если учесть одну цветную полосу в 2 разных графиках? - PullRequest
0 голосов
/ 09 сентября 2018

Я хочу нарисовать фигуру из двух графиков с одной цветной полосой. Тем не менее, эти два участка находятся в разных диапазонах. Я попытался использовать контур, чтобы сделать это, но не получилось. Цветовая полоса contourf всегда отображается в диапазоне последних вспомогательных участков, но мне нужна цветовая полоса, которая находится в диапазоне обоих двух вспомогательных участков. Я изменил контур на pcolor без каких-либо других модифицированных кодов и, наконец, сделал это. Я получил вдохновение по ссылке: Установить диапазон цветовой шкалы в 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()

На рисунке ниже показан цвет

enter image description here

Тем не менее, рисунок ниже о контуре

enter image description here

и коды для контурного графика:

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()

1 Ответ

0 голосов
/ 09 сентября 2018

Если вы спрашиваете, почему один из них кажется исправленным, а другой - более непрерывным, это сделано намеренно и зависит от того, из какого типа вы печатаете карту, чтобы нарисовать цветную полосу.

См. Исходный код здесь , в основном он проверяет, является ли сопоставляемый элемент счетчиком, в таком случае он нарисует ColorbarPatch, в противном случае нарисует нормальный Colorbar. На несколько строк выше этого вы можете видеть, что класс ColorbarPatch в основном выходит из класса Colorbar и, по существу, рисует цветовую панель в наборе дискретных уровней, переопределяя методы _add_solids (которые находятся в Поворот соответствует уровням от ContourSet, который вы указали в качестве сопоставляемого параметра.

...