Пользовательская Colormap в Python

Я хотел бы создать собственную пользовательскую цветовую карту в python, я просмотрел некоторые онлайн-примеры и узнал команды

from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.colors import LinearSegmentedColormap

cdict1 = {'red':   ((0.0, 0.0, 0.0),
                    (0.5, 0.0, 0.1),
                    (1.0, 1.0, 1.0)),

         'green': ((0.0, 0.0, 0.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 1.0),
                   (0.5, 0.1, 0.0),
                   (1.0, 0.0, 0.0))
         }

blue_red1 = LinearSegmentedColormap('BlueRed1', cdict1)
plt.imshow(big,interpolation='nearest',  cmap=blue_red1, aspect='auto')
plt.colorbar()
plt.show()

С помощью приведенной выше команды я получаю цветную карту (красный - черный - синий), где красный - максимальный, а синий - минимальный. Я хотел бы создать цветную карту, которая (черный - белый - черный). Может ли кто-нибудь сказать мне, что нужно делать или какой-либо другой метод?

Ответ 1

Для чего это стоит, есть и более простой метод.

Полная форма LinearSegmentedColormap дает вам возможность иметь "жесткие" остановки и градиенты в одной цветовой карте, поэтому она обязательно сложна. Тем не менее, есть удобный конструктор для простых случаев, таких как то, что вы описываете.

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

cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'white', 'black'])

fig, ax = plt.subplots()
im = ax.imshow(np.random.random((10, 10)), cmap=cmap, interpolation='nearest')
fig.colorbar(im)
plt.show()

введите описание изображения здесь

Ответ 2

Вы хотите, чтобы все три компонента были равны 0 как 0, так и 1, а все три - 1 на 0,5. Итак, у вас есть:

cdict1 = {'red':  ((0.0, 0.0, 0.0),   # <- at 0.0, the red component is 0
                   (0.5, 1.0, 1.0),   # <- at 0.5, the red component is 1
                   (1.0, 0.0, 0.0)),  # <- at 1.0, the red component is 0

         'green': ((0.0, 0.0, 0.0),   # <- etc.
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0))
         }

введите описание изображения здесь

Ответ 3

Я также обнаружил, что создание цветовой палитры запутывает. LinearSegmentedColormap хорош, потому что он очень гибкий, но cdict немного привыкает.

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

Вторая вещь, которая важна для обучения для создания цветовых паттернов таким образом: всегда делайте 2-е и 3-е значения каждого кортежа одинаковым до тех пор, пока вам не станет удобно создавать простые линейные цветовые карты. В конце концов вы можете изменить эти значения, чтобы сделать разрывы в цветовых каталогах, но это смутит вас только при запуске.

ОК, поэтому первое значение в каждом кортеже - это "фракция" цветовой палитры, и они должны идти от 0 до 1, второе и третье значения - это интенсивность для этого цвета (нижняя и верхняя границы). Итак, чтобы сделать цветную черту "черно-белой-черной", вы бы сделали:

cdict1 = {
    'red':   ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),

    'green': ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),

    'blue':   ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),
         }

black_white_black = LinearSegmentedColormap('BlackWhiteBlack', cdict1)

Например,

plt.imshow(np.arange(100).reshape(10,10), cmap=black_white_black, aspect='auto')
plt.colorbar()

Пример изображения

Удачи!

Ответ 4

Попробуйте cdict1 из

cdict1 = {'red':   ((0.0, 0.0, 0.0),
                    (0.5, 1.0, 1.0),
                    (1.0, 0.0, 0.0)),

         'green': ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0))
         }

В этом словаре описывается, как интерполируются цвета, глядя на каждый компонент красно-зелено-голубой отдельно. Для каждого компонента вы даете ему список 3-х кортежей (x, y0, y1), которые определяют, как интерполировать этот компонент, и каждое значение, которое вы хотите, интерполируется между двумя точками в списке.

В этом случае мы хотим начать с черного [RGB = (0,0,0)], увеличиться до белого [RGB = 1,1,1] на полпути диапазона данных, а затем уменьшиться до черный в конце.

Для каждого значения для назначения цвета карта сначала преобразует это значение в часть входного диапазона, так что оно имеет что-то в диапазоне [0, 1]. Чтобы получить уровень красного компонента, карта будет сканировать первый элемент в каждом 3-кортеже в "красном" списке и захватить самую большую, не превышающую вашу долю. Назначенный красный уровень будет интерполирован между элементом y1 этого 3-кортежа и элементом y0 следующего 3-кортежа в зависимости от разницы в значении x.

Аналогично для синих и зеленых компонентов.