Я хотел бы использовать colormap из matplotlib, например. CMRmap. Но я не хочу использовать "черный" цвет в начале и "белый" цвет в конце. Мне интересно отображать мои данные, используя промежуточные цвета. Я думаю, что ppl использует его довольно часто, но я искал через Интернет и не мог найти простого решения. Я буду признателен, если кто-нибудь предложит какое-либо решение.
Как извлечь подмножество цветовой карты в качестве новой цветовой карты в matplotlib?
Ответ 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()
Рисунок слева показывает изображение с использованием исходной цветовой карты (в этом примере 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)