источник

ал сfrom_levels_and_colors функция, так что я могу иметь расширенную цветовую панель на графике pcolormesh, аналогично контурной. Вот мой пример контурного сюжета:

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(12)[:,np.newaxis] * np.ones(8)
levels = np.arange(1.5, 10, 2)

plt.contourf(a, cmap='RdYlBu', levels=levels, extend='both')
plt.colorbar()

Для создания аналогичного графика pcolormesh мне нужно предоставить последовательность цветов, поэтому у меня есть:

from matplotlib.colors import from_levels_and_colors

n_colors = len(levels) + 1
cmap = plt.get_cmap('RdYlBu', n_colors)
colors = cmap(range(cmap.N))
cmap, norm = from_levels_and_colors(levels, colors, extend='both')
plt.pcolormesh(a, cmap=cmap, norm=norm)
plt.colorbar()

Средние четыре цвета в pcolormesh светлее, чем в контуре. Как я могу выбрать их, чтобы они соответствовали?

 ImportanceOfBeingErnest16 окт. 2017 г., 19:35
Цвета для контурного графика берутся из середины соответствующего интервала. Очень трудно воспроизвести это поведение для графика, который имеет больше «уровней», таких как график pcolor.

Ответы на вопрос(1)

Решение Вопроса

что цвета дляcontourf Участок взят с середины соответствующего интервала. Чтобы повторить то же поведение дляpcolor сюжет, вам нужно выбрать цвета не просто так, как на одинаковом расстоянии от цветовой карты (colors = cmap(range(cmap.N))), но как две конечные точки карты и соответствующие средства между границами уровней.

cnorm = plt.Normalize(vmin=levels[0],vmax=levels[-1])
clevels = [levels[0]] + list(0.5*(levels[1:]+levels[:-1])) + [levels[-1]]
colors=plt.cm.RdYlBu(cnorm(clevels))

Полный код:

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

a = np.arange(12)[:,np.newaxis] * np.ones(8)
levels = np.arange(1.5, 10, 2)

fig, (ax,ax2) = plt.subplots(ncols=2)

ax.set_title("contourf")
cf = ax.contourf(a, levels=levels, cmap='RdYlBu', extend='both') #, 
fig.colorbar(cf, ax=ax)

##### pcolormesh

cnorm = plt.Normalize(vmin=levels[0],vmax=levels[-1])
clevels = [levels[0]] + list(0.5*(levels[1:]+levels[:-1])) + [levels[-1]]
colors=plt.cm.RdYlBu(cnorm(clevels))

cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors, extend='both')
cf = ax2.pcolormesh(a, cmap=cmap, norm=norm)
ax2.set_title("pcolormesh")
fig.colorbar(cf,ax=ax2)


plt.tight_layout()
plt.show()

Чтобы лучше понять решение, вы можете заменить линиюcmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors, extend='both') по

norm=matplotlib.colors.BoundaryNorm(levels, ncolors=len(levels)-1)

cmap = matplotlib.colors.ListedColormap(colors[1:-1], N=len(levels)-1)
cmap.set_under(colors[0])
cmap.set_over(colors[-1])
cmap.colorbar_extend = "both"

Это может прояснить, откуда берутся цвета и используемая в конечном итоге цветовая карта.

 RuthC17 окт. 2017 г., 15:23
Спасибо за подробное объяснение. Является ли подход к выборуcontourf цвета задокументированы где-то? Такое чувство, что я должен был посмотреть вверх!
 ImportanceOfBeingErnest17 окт. 2017 г., 17:10
Я не знаю, если это где-то в документации. Есть хотя быкомментарий в исходном коде говоря «Цвет основан на средней точке слоя, за исключением расширенных конечных слоев». И если вы посмотрите достаточно глубоко, вы можете прочитать это изисточник.

Ваш ответ на вопрос