Matlab: одна и та же цветовая карта для истории, графика и сетки

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

Есть ли способ установить одну и ту же цветовую карту для всех типов графиков или указать по одной для каждого из них? Еще одна странная вещь: я могу установить цветовую карту для истории, например, с помощью инструментов фигуры, но не для обычного plot. Для меша я должен использовать цикл hold on, так что я думаю, установка цвета здесь отличается от определения палитры?

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

Редактировать:

Вот минимальный пример. Он все еще не работает, см. комментарии в коде ниже.

clear all;
close all;
clc;

% make up some data with the original format
freqLen = 5;
data = zeros(10, 3, 3, freqLen);
data(:, :, :, 1) = rand(10, 3, 3);
data(:, :, :, 2) = rand(10, 3, 3)+1;
data(:, :, :, 3) = rand(10, 3, 3)+2;
data(:, :, :, 4) = rand(10, 3, 3)+3;
data(:, :, :, 5) = rand(10, 3, 3)+4;
% reshape data so we get a vector for each frequency
dataF = reshape(data, [10*3*3, freqLen]);

% prepare colors for plot, try to get 5 colors over the range of colormap
% but I get wrong colors using both methods below!
%cols = colormap(jet);
%cols = cols(1:round(length(cols)/length(freqGHz)):end, :);
cols = jet(freqLen);

% plot samples in 3D
figure('Position', [0 0 1000 1000]);
subplot(211);
hold on;
for iF = 1:freqLen
    dataThisF = dataF(:, iF);
    data3D = reshape(dataThisF, [10*3, 3]);
    mesh(data3D);
    % try to give each "holded" mesh a different color. Not working!
    % after the loop, all meshes have the last color
    set(get(gca, 'child'), 'FaceColor', 'w', 'EdgeColor', cols(iF, :));
end
view(60, 20);

% plot samples
subplot(223);
hold on;
for iF = 1:freqLen
    % the loop is not avoidable
    % because matlab maps the colors wrong when plotting as a matrix
    % at least its not using the colormap colors
    plot(dataF(:, iF), 'Color', cols(iF, :));
end

% plot histogram
subplot(224);
% actually the only one which is working as intended, horray!
hist(dataF, 50);

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

Как я могу придать удерживаемой сетке один цвет, отличный от других? Как я могу сопоставить правильную карту цветов струи при построении матрицы с использованием простого линейного графика или, по крайней мере, получить 5 цветов из карты цветов струи (jet(5) дает 5 разных цветов, но не от начала до конца)?


person Azial    schedule 28.08.2015    source источник
comment
Можете ли вы показать небольшой фрагмент кода того, как вы создаете один из них? Вы рисуете все данные в одном и том же порядке? то есть сначала всегда 10Ghz, потом 15,...   -  person Ander Biguri    schedule 28.08.2015


Ответы (2)


То, о чем вы говорите, в основном относится к свойству ColorOrder (а не colormap на рисунке).

Ссылка для colororder, приведенная чуть выше, объяснит вам, как заставить Matlab использовать заданный набор цветов для всех графиков. Он отлично работает для plot. Вам не понадобится цикл, просто определите свойство DefaultColororder фигуры перед графиками, а затем постройте все свои серии одним вызовом, Matlab назначит цвет каждому графику в соответствии с порядком, который вы определили ранее.

К сожалению, для mesh и hist это не так просто, поэтому вам придется запустить цикл, чтобы указать цвет или каждый графический объект. Чтобы изменить свойство графического объекта (например, цвет) после его создания, вы должны использовать метод set или даже прямую запись через точку, если вы используете версию Matlab >= 2014b. Для обоих методов вам необходимо иметь handle графического объекта, поэтому обычно проще всего, когда вы знаете, что вам это понадобится, получить дескриптор графического объекта во время создания*.

*вместо грязного хака, такого как get(gca, 'child'). Это довольно подвержено ошибкам и на самом деле было неправильным в вашем случае. Ваш код не будет иметь правильного цвета, потому что таким образом вы не получите правильный графический дескриптор.

Приведенный ниже код строит все ваши графики, получает дескриптор каждого графического объекта, а затем назначает цвета в последнем цикле.


%// Get a few colors
cols = jet(freqLen);

% plot samples in 3D
figure('Position', [0 0 1000 1000]);
set( gcf , 'DefaultAxesColorOrder',cols) %// set the line color order for this figure

subplot(2,1,1,'NextPlot','add');         %// 'NextPlot','add' == "hold on" ;
for iF = 1:freqLen
    dataThisF = dataF(:, iF);
    data3D = reshape(dataThisF, [10*3, 3]);
    h.mesh(iF) = mesh(data3D) ;         %// plot MESH and retrieve handles

    %// You can set the color here direct, or in the last final "coloring" loop
    %// set( h.mesh(iF) , 'FaceColor', 'w', 'EdgeColor', cols(iF, :));
end
view(60, 20);

%// plot samples
subplot(223);
h.plots = plot(dataF);                  %// plot LINES and retrieve handles

%// plot histogram
subplot(224);
[counts,centers] = hist(dataF, 50 ) ;   %// get the counts values for each series
h.hist = bar(centers,counts) ;          %// plot HISTOGRAM and retrieve handles

%// now color every series with the same color
for iF = 1:freqLen
    thisColor = cols(iF, :) ;
    set( h.mesh(iF)  , 'EdgeColor' , thisColor  , 'FaceColor', 'w' );
    set( h.hist(iF)  , 'EdgeColor' , thisColor  , 'FaceColor' , thisColor )
    %// this is actually redundant, the colors of the plots were already right from the
    %// beginning thanks to the "DefaultColorOrder" property we specified earlier
    set( h.plots(iF) , 'Color'     , thisColor ) 
end

Вы получите следующую фигуру: colororder

person Hoki    schedule 01.09.2015

ОБНОВЛЕНИЕ: задан исходный вопрос

Есть ли способ установить одну и ту же цветовую карту для всех типов графиков или указать по одной для каждого из них?

этот ответ отвечает на этот вопрос с цветовой картой, которая буквально означает colormap в MATLAB.


Вы можете установить цветовую карту для фигуры, используя colormap . Вы можете использовать одну из множества встроенных палитр или указать свою собственную.


Пример использования mesh и встроенной палитры hsv может быть

figure;
mesh(data);
colormap(hsv);

Это применит палитру на основе

Цвет MATLAB hsv

к вашей фигуре. Вы также можете создать свою собственную карту цветов, например

map = [1, 0, 0,
       1, 1, 1,
       0, 1, 0,
       0, 0, 0];
colormap(map);

который создаст палитру с цветами Красный, Белый, Синий и Черный.

Карта цветов флага MATLAB


Документация MATLAB содержит обширную информацию об использовании colormap.

person IKavanagh    schedule 28.08.2015
comment
Хм, я не думаю, что он ищет палитру, как это определяет MATLAB. Я думаю, он хочет иметь одинаковый цвет для каждого диапазона данных на всех отдельных графиках (например, синий 10 ГГц, красный 20 ГГц и т. д. на всех рисунках). - person Adriaan; 28.08.2015
comment
спасибо, это я тоже узнал. Однако установка палитры для меша окрашивает все меши в зависимости от высоты. Я думаю, что мне нужно установить цвет их края независимо, используя set(cga,...) или что-то в этом роде. Изменение цветов для линейного графика тоже кажется другим, используя set(0, 'DefaultAxesColorOrder', jet(5)). - person Azial; 28.08.2015
comment
@Azial Редактирование делает его более ясным, но вопрос все еще немного нечеткий. Я взял Есть ли способ установить одну и ту же палитру для всех типов графиков или указать по одной для каждого из них? означает colormap буквально в MATLAB. Я отредактировал свой ответ, чтобы явно указать, на что он отвечает. Я оставлю его здесь на случай, если кому-то это понадобится в будущем, поскольку я чувствую, что он все еще отвечает на название вопроса. - person IKavanagh; 28.08.2015
comment
Да, извините за это. Я думал, что в Matlab есть более общий способ указать для каждого типа графика, но, похоже, в моем случае требуется немного больше работы. Я опубликую свой результат, когда я закончу это. - person Azial; 28.08.2015