Как пометить цветовые карты в MATLAB?

У меня есть следующее изображение, полученное из imagesc (некоторая матрица, элементы которой соответствуют этим цветам). Голубой и желтый означают разные вещи. Я хотел бы либо:

  1. Добавить легенду, где я могу указать, что означает каждый цвет

  2. Разделите части оси X, где я могу ввести «голубой» в области x ниже голубой части и «желтый» в области x ниже желтой части.

Либо, либо было бы хорошо, и что бы ни было проще, было бы подходящим для меня.

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

                CYAN                         YELLOW

person Alvin Nunez    schedule 16.07.2015    source источник
comment
Не могли бы вы создать иллюстрацию, показывающую, чего вы хотите достичь? (т.е. поместите текстовые метки там, где вы хотите, чтобы текст был)   -  person Dev-iL    schedule 17.07.2015
comment
Несколько вопросов: ваш образ всегда состоит из 2-х частей? Вы заранее знаете, что будете писать в метках, или хотите, чтобы текст был редактируемым полем? Для текста под рисунком вы пробовали annotation? Что касается легенды, я полагаю, вы можете нанести одну точку (в стиле заполненного квадратного маркера того же цвета, что и содержащая область) на каждой из цветных областей и просто отображать легенду в обычном режиме...   -  person Dev-iL    schedule 17.07.2015
comment
Нет, иногда мое изображение состоит из 7 частей. Я хочу, чтобы метки были сосредоточены вокруг цветовой области.   -  person Alvin Nunez    schedule 17.07.2015
comment
Вот почему я попросил у вас иллюстрацию ... Я имел в виду, откройте это изображение в Paint Brush или эквиваленте вашей ОС и покажите нам, как должен выглядеть конечный результат, со сложными входными данными (т.е. 6-7 цветов)! Всегда ли они расположены горизонтально? Кроме того, они всегда появляются в одном и том же порядке?   -  person Dev-iL    schedule 17.07.2015
comment
так что @AlvinNunez помог вам какой-либо ответ ниже? Если да, пожалуйста, примите один из них; если нет, пожалуйста, сообщите нам. Спасибо!   -  person Benoit_11    schedule 20.07.2015
comment
Прошу прощения, эти ответы великолепны, я выбрал один.   -  person Alvin Nunez    schedule 21.07.2015


Ответы (2)


Вот еще один вариант: matlab-hg2 дружелюбный:

%% // Initialization
clear variables; close all force; clc;
%% // Generate some data
fakeData = magic(3)-0.5;
fakeData_horz = fakeData(:)'; %//'
fakeNames = cellstr(strcat('color',num2str((1:9)'))); %//'
fakeNameMapping = fakeNames(randperm(numel(fakeData)));
%% // Create figure
hFig = figure('Position',[680,488,758,610],'Resize','off');

%% // Top left example
cLims = [0 numel(fakeData)+1];
hSp = subplot(2,2,1); 
imagesc(fakeData); axis image; set(hSp,'XTick',[],'YTick',[]);
colorbar; caxis(cLims); 
[XX,YY] = meshgrid(1:size(fakeData,1),1:size(fakeData,2));
text(XX(:),YY(:),fakeNameMapping,'HorizontalAlignment','center');

%% // Bottom example
hSp = subplot(2,2,3:4);
cLims = [0 numel(fakeData)+1]; %Not required here since unchanged
imagesc(fakeData_horz); axis image; set(hSp,'XTick',[],'YTick',[]);
colorbar; caxis(cLims); 
drawnow; %// This command will allow the annotations to be positioned properly
for ind1=1:numel(fakeData_horz)
    newPos = [hSp.Position(1)+hSp.Position(3)/numel(fakeData_horz) * (ind1-1),...
              hSp.Position(2)*1.6,... %1.6 is chosen for the demo
              hSp.Position(3)/numel(fakeData_horz),...
              0.05]; % 0.05 is chosen for the demo; play around with it
    h= annotation('textbox',newPos,'String',fakeNameMapping{ind1},...
        'LineStyle','none','HorizontalAlignment','center');
end

%% // Top right example
hSp = subplot(2,2,2);
cLims = [0 numel(fakeData)]; %// cLims is a bit different here!
imagesc(fakeData); axis image; set(hSp,'XTick',[],'YTick',[]);
caxis(hSp,cLims); colormap(hSp,parula(numel(fakeData)));
cb = colorbar; %// This time we need a handle to the colorbar
cb.Ticks = (hSp.CLim(1):hSp.CLim(2))+0.5; %// Set the tick positions
cb.TickLabels = fakeNames; %// Set the tick strings

В результате получается: введите здесь описание изображения

Примечание: если не используется более интеллектуальное вычисление позиционирования текста, размер фигуры не должен изменяться после ее построения (во 2-м примере), потому что тогда текст больше не остается там, где он должен быть.


Изменить: добавлена ​​еще одна опция, где помечена только цветовая полоса.

person Dev-iL    schedule 17.07.2015
comment
Вау, очень красиво и намного элегантнее, чем у меня! +1 :) - person Benoit_11; 17.07.2015
comment
@Benoit_11 - Спасибо, я ценю добрые слова! - person Dev-iL; 17.07.2015
comment
Dev-iL, можно ли как-то увеличить нижний график? - person Alvin Nunez; 21.07.2015
comment
@AlvinNunez 1) Не используйте сюжет; 2) Укажите большую ширину и высоту в hFig = figure('Position',[680,488,758,610],'Resize','off'); - person Dev-iL; 21.07.2015

Вы хотите что-то вроде этого? Это очень просто, ха-ха.

clc
clear
close all

%// Dummy array
A = repmat([0 0 0 1 1 1],6,1);

imagesc(A)

hold on

%// Dummy data to add legend
scatter(0,0,1,'b','filled')
scatter(0,0,1,'r','filled')

axis off
colorbar

%// Get axis coordinates (x first and then y)
ax = axis;

%// Add text. You can easily adjust the x-offset depending on how many colors you have.
text(ax(2)/4+ax(1),ax(4)+.2,'Blue','Color','b','FontSize',20,'HorizontalAlignment','Center')
text(3*ax(2)/4+.2,ax(4)+.2,'Red','Color','r','FontSize',20,'HorizontalAlignment','Center')

%// Add legend
legend({'Blue';'Red'})

Выход:

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

person Benoit_11    schedule 16.07.2015
comment
Я должен назвать тебя королем сюжета. - person rayryeng; 17.07.2015