Как получить согласованную дискретную карту цветов / цветовую шкалу с «верхним» и «нижним» значениями - PullRequest
0 голосов
/ 25 января 2019

Изображение стоит тысячи слов: https://www.harrisgeospatial.com/docs/html/images/colorbars.png

Я хочу получить ту же цветную полосу, что и справа, с помощью matplotlib.Поведение по умолчанию использует один и тот же цвет для "верхней" / "нижней" и соседней ячейки ...

Спасибо за вашу помощь!

Вот код, который у меня есть:

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

N = 100
X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots(1, 1, figsize=(8, 8))

# even bounds gives a contour-like effect
bounds = np.linspace(-1, 1, 10)
norm = colors.BoundaryNorm(boundaries=bounds, ncolors=256)
pcm = ax.pcolormesh(X, Y, Z,
                    norm=norm,
                    cmap='RdBu_r')
fig.colorbar(pcm, ax=ax, extend='both', orientation='vertical')

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Чтобы цвет "over" / "under" цветовой карты принимал первый / последний цвет этой карты, но при этом отличался от последнего цвета внутри цветового диапазона, вы можете получить еще один цвет из цветовой картычем у вас есть границы в BoundaryNorm и использовать первый и последний цвет в качестве соответствующих цветов для «над» / «под» -цвета.

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

N = 100
X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots(1, 1, figsize=(8, 8))

# even bounds gives a contour-like effect
bounds = np.linspace(-1, 1, 11)
# get one more color than bounds from colormap
colors = plt.get_cmap('RdBu_r')(np.linspace(0,1,len(bounds)+1))
# create colormap without the outmost colors
cmap = mcolors.ListedColormap(colors[1:-1])
# set upper/lower color
cmap.set_over(colors[-1])
cmap.set_under(colors[0])
# create norm from bounds
norm = mcolors.BoundaryNorm(boundaries=bounds, ncolors=len(bounds)-1)
pcm = ax.pcolormesh(X, Y, Z, norm=norm, cmap=cmap)
fig.colorbar(pcm, ax=ax, extend='both', orientation='vertical')

plt.show()

enter image description here

0 голосов
/ 25 января 2019

Как предлагается в моем комментарии, вы можете изменить цветовую карту с помощью

pcm = ax.pcolormesh(X, Y, Z, norm=norm, cmap='rainbow_r')

Это дает:

enter image description here

Вы можете определить свою собственную цветовую карту, как показано здесь: Создать собственную цветовую карту, используя matplotlib и цветовую шкалу графика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...