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

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

4 ответа

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

Полная форма 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()

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

Вы хотите, чтобы все три компонента были равны 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))
         }

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

Я также нашел, что создание цветовой карты сбивает с толку. 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()

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

Удачи!

Попробуйте 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))
         }

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

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

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

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

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