Как использовать только часть существующей палитры?

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

DataToPlot = pcolor(myData);
set(DataToPlot,'edgecolor','none'); %to remove grid
colormap(flipud(spring));
caxis([-4 4]);
colorbar;

В настоящий момент цвет, связанный со значением -4, желтый, а цвет, связанный с +4, ярко-розовый. Я хотел бы изменить эту шкалу и оставить в качестве цвета, связанного с -4, то, что сейчас является цветом для 0 (который является светло-розовым), и оставить цвет, связанный с +4, как ярко-розовый.

Как я могу это сделать?

caxis - это, может быть, то, что вам нужно. В противном случае возьмите цветовую карту, обрежьте ее там, где хотите, а затем установите ее как цветовую карту.
Ander Biguri 11.04.2018 12:02

Чтобы уточнить комментарий Андера - допустим, вам нужна только красная-> зеленая часть цветовой карты HSV, вы можете сделать что-то вроде cm = hsv(300); cm = cm(1:100,:); colormap(cm);

Dev-iL 11.04.2018 12:05

@ Dev-iL, спасибо, очень помог. Просто вопрос, извините, если основы, но как узнать значения (в вашем примере 300 и 1: 100) для выбора? Есть ли индекс для каждой палитры? Спасибо.

dede 11.04.2018 12:11

Мне просто нравится визуально гладкая палитра, поэтому я обычно использую не менее 100 цветов. Просто глядя на цветовую карту, мне показалось, что это примерно 1/3 - следовательно, чтобы получить цветовую карту длиной 100 записей, мне нужно было создать цветовую карту длиной 300 и получить первую треть.

Dev-iL 11.04.2018 12:11
0
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрим следующий пример:

figure(); imagesc(magic(4)-8); colorbar;
% Flipped "spring" colormap:
cm = flipud(spring); colormap(cm);

Теперь у нас есть:

Flipped <code>spring</code>

Если нам нужен только подмножество цветовой карты (например, от желтого до розового), мы можем взять подмножество строк массива, возвращаемого spring:

cm = flipud(spring(200)); colormap(cm(1:100,:));

где 200 - это разрешение цветовой карты, которую мы хотим получить, а 100 - это приблизительно положение карты, где мы хотим вырезать, что дает:

First half of the flipped <code>spring</code>

Если мы хотим изменить масштаб цветовой карты (или, другими словами, изменить отображение данных в цвета так, чтобы минимальное / максимальное значение не соответствовало нижнему / верхнему цвету), мы можем использовать функцию caxis, чтобы установить различные ограничения для цветовой карты. Например:

cm = flipud(spring); colormap(cm); caxis([-7 24]);

дает такую ​​же окраску данных с использованием полной палитры:

Rescaled colormap

Бонус: не забывайте, что вы также можете комбинировать разные цветовые карты:

cm = [flipud(bone(50)); copper(50)]; colormap(cm);

enter image description here

Это очень исчерпывающий ответ. Спасибо! Вы знаете, сколько цветов Matlab на самом деле использует для создания цветовой карты? Например, если у нас есть палитра от -4 до +4, использует ли Matlab 800 цветов (т.е. 100 цветов для каждой единицы)? Просто любопытство.

dede 11.04.2018 17:53

Что ж, это легко проверить ... просто набери cm = spring и посмотри на размер вывода. Результат не совсем то, что вы ожидали :)

Dev-iL 11.04.2018 17:55

Отлично, большое спасибо!

dede 11.04.2018 17:57

Я пробовал последний показанный вами код, и это очень хорошо. Но если я это сделаю: mySpring = spring(400); mySpring = mySpring(1:200,:); colormap(flipud(mySpring)); myBone = bone(400); myBone = myBone(1:200,:); colormap(myBone); cm = [myBone(50);flipud(mySpring(50))]; colormap(cm);, я получаю эту ошибку: Error using colormap (line 93) Colormap must have 3 columns: [R,G,B]. Знаете почему?

dede 11.04.2018 18:01

@dede вы не можете этого сделать, потому что функции spring и bone не являются простыми 2D-массивами, а скорее выполняют некоторые вычисления. Вы можете открыть любой из них, чтобы увидеть, как он работает. Если вы хотите исправить свой пример, убедитесь, что вы используете mySpring(1:50,:), а не только mySpring(50). spring(50) возвращает массив 50x3, тогда как mySpring(50) является скаляром.

Dev-iL 11.04.2018 18:08

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