Пользовательская цветовая карта 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()

Другие вопросы по тегам