Подтвердить что ты не робот

Как извлечь подмножество цветовой карты в качестве новой цветовой карты в matplotlib?

Я хотел бы использовать colormap из matplotlib, например. CMRmap. Но я не хочу использовать "черный" цвет в начале и "белый" цвет в конце. Мне интересно отображать мои данные, используя промежуточные цвета. Я думаю, что ppl использует его довольно часто, но я искал через Интернет и не мог найти простого решения. Я буду признателен, если кто-нибудь предложит какое-либо решение.

4b9b3361

Ответ 1

Статический метод colors.LinearSegmentedColormap.from_list можно использовать для создания новых LinearSegmentedColormaps. Ниже я беру исходную цветовую палитру в 100 точках между 0,2 и 0,8:

cmap(np.linspace(0.2, 0.8, 100))

и используйте эти цвета для создания новой цветовой карты:

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

def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100):
    new_cmap = colors.LinearSegmentedColormap.from_list(
        'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval),
        cmap(np.linspace(minval, maxval, n)))
    return new_cmap

arr = np.linspace(0, 50, 100).reshape((10, 10))
fig, ax = plt.subplots(ncols=2)

cmap = plt.get_cmap('jet')
new_cmap = truncate_colormap(cmap, 0.2, 0.8)
ax[0].imshow(arr, interpolation='nearest', cmap=cmap)
ax[1].imshow(arr, interpolation='nearest', cmap=new_cmap)
plt.show()

enter image description here

Рисунок слева показывает изображение с использованием исходной цветовой карты (в этом примере jet). На рисунке справа показано то же изображение с помощью new_cmap.

Ответ 2

Я только недавно боролся с этим сам. Вот несколько возможных решений:


Попробуйте использовать vmin, vmax аргументы ключевого слова в вашей функции построения графика. Например, скажем, что у вас есть данные между 0 и 1, но не понравились цвета, используемые в крайних точках цветовой карты для 0 и 1.

import matplotlib.pyplot as plt
import matplotlib.cm as cm

my_cmap = cm.spectral_r
my_cmap.set_over('c')
my_cmap.set_under('m')
plt.pcolor(data, vmin=0.01, vmax=0.99, cmap=my_cmap)

Это приведет к тому, что весь набор цветов будет использоваться для значений от 0,01 до 0,99, а значения выше и ниже будут соответственно голубыми и пурпурными. Это может не решить вашу проблему точно, но это может быть полезно, если вам нравится конкретная цветовая палитра, и желайте, чтобы на обоих концах были дополнительные цвета.


Если вы действительно хотите изменить цветовой код, посмотрите документацию здесь и LinearSegmentedColormap здесь.

Во-первых,

import matplotlib.cm as cm
cdict = cm.get_cmap('spectral_r')._segmentdata

Это возвращает словарь всех цветов, которые составляют цветовую палитру. Однако довольно сложно понять, как изменить словарь. У этого dict есть три клавиши, red, green, blue. cdict[key] возвращает список значений формы (x, y0, y1). Посмотрим на два последовательных элемента cdict['red']:

((0.0, 0.0, 0.0)
 (0.5, 1.0, 1.0),...

Это означает, что данные с z (при условии, что мы делаем pcolor или imshow) между 0.0 и 0.5, будут иметь красный компонент цвета rgb, связанный с этими данными, будет увеличиваться с 0.0 ( нет красного) до 1,0 (максимальный красный). Это означает, что для изменения цвета цветовой карты вы должны изучить, как каждый из трех компонентов rgb интерполируется в области интересующей вас цветовой карты. Просто убедитесь, что для каждого цвета первый и последняя запись начинается с x=0 и x=1 соответственно; вы должны охватить весь спектр [0, 1].

Если вы хотите изменить цвета начала и конца, попробуйте

import matplotlib.cm as cm
from matplotlib.colors import LinearSegmentedColormap
cdict = cm.get_cmap('spectral_r')._segmentdata

cdict['red'][0] = (0, 0.5, 0.5) # x=0 for bottom color in colormap
cdict['blue'][0] = (0, 0.5, 0.5) # y=0.5 gray
cdict['green'][0] = (0, 0.5, 0.5) # y1=y for simple interpolation
cdict['red'][-1] = (1, 0.5, 0.5) # x=1 for top color in colormap
cdict['blue'][-1] = (1, 0.5, 0.5)
cdict['green'][-1] = (1, 0.5, 0.5)

my_cmap = LinearSegmentedColormap('name', cdict)

Затем используйте этот cmap в вашей функции построения графика.


То, что я хотел сделать, это изменить серый цвет в конце цветовой палитры spectral_r на чистый белый. Это было достигнуто с помощью

# Using imports from above
cdict = matplotlib.cm.get_cmap('spectral_r')._segmentdata
cdict['red'][0] = (0, 1, 1)
cdict['green'][0] = (0, 1, 1)
cdict['blue'][0] = (0, 1, 1)
my_cmap = LinearSegmentedColormap('my_cmap', cdict)