Пользовательская цветовая карта Matplotlib - как pgfplots
Можно ли получить сине-желто-красную цветовую карту от pgfplots
, как в этом примере https://tex.stackexchange.com/questions/39145/scaling-colormaps-with-pgfplots, в matplotlib
?
Я посмотрел, как определить пользовательские цветовые карты в matplotlib, но это кажется очень сложным.
2 ответа
Определение собственного cmap - это путь. Это не так сложно, но вы должны убедиться, что вы понимаете все значения в color dict
,
Для каждого цвета вы указываете три столбца значений. Первый столбец - это позиция, в которой появляется цвет, 0 - первый, а 1 - последний. Так как вы хотите три цвета, есть три равномерно распределенные позиции, определенные 0, 0,5 и 1,0.
Ты хочешь:
0.0: синий
0,5: желтый
1.0: красный
Второй столбец определяет цвет "до" позиции, третий столбец - цвет "от / после" этой позиции. Если вы хотите, чтобы цвета постепенно исчезали, вы должны оставить их такими же. Задание разных цветов позволяет цветовой карте совершать внезапные "скачки" после определенной позиции.
Чтобы получить синий в позиции 0.0, установите красный и зеленый в 0, а синий в 1. Чтобы получить желтый в позиции 0.5, установите красный и зеленый в 1 и синий в ноль. И так далее...
import matplotlib as mpl
from matplotlib import pyplot as plt
import numpy as np
cdict = {'red': ((0.0, 0.0, 0.0),
(0.5, 1.0, 1.0),
(1.0, 1.0, 1.0)),
'green':((0.0, 0.0, 0.0),
(0.5, 1.0, 1.0),
(1.0, 0.0, 0.0)),
'blue':((0.0, 1.0, 1.0),
(0.5, 0.0, 0.0),
(1.0, 0.0, 0.0))}
custom_cmap = mpl.colors.LinearSegmentedColormap('mymap', cdict, 256)
plt.imshow(np.arange(36).reshape(6,6), cmap=custom_cmap, interpolation='none')
@RutgerKassies имеет отличное объяснение того, как линейные цветовые карты работают в matplotlib в целом. Когда вам нужны цветовые карты с неровными переходами или "жесткими" обрезками, вам нужно указать полное dict
пороговых значений.
Однако есть удобная "заводская функция" для простых цветовых карт с равномерными переходами между цветами: LinearSegmentedColormap.from_list
(На самом деле, вы можете даже сделать неровные переходы с ним, лишь бы они не были "жесткими".)
Например (чтобы украсть пример Рутгера), мы можем сделать это с:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list('mymap', ['blue', 'yellow', 'red'])
plt.imshow(np.arange(36).reshape(6,6), cmap=cmap, interpolation='none')
plt.show()