Автоматически наносить разноцветные линии - PullRequest
106 голосов
/ 08 января 2010

Я пытаюсь построить несколько оценок плотности ядра на одном графике, и я хочу, чтобы они были разных цветов. У меня есть решение kludged, использующее строку 'rgbcmyk' и проходящее через нее для каждого отдельного графика, но у меня появляются дубликаты после 7 итераций. Есть ли более простой и эффективный способ сделать это с большим количеством вариантов цвета?

for n=1:10
 source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
 [f,x]=ksdensity(source(n).data); % calculate the distribution
 plot(x,f,cstring(mod(n,7)+1))  % plot with a different color each time
end

Ответы [ 5 ]

129 голосов
/ 08 января 2010

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

cc=hsv(12);
figure; 
hold on;
for i=1:12
    plot([0 1],[0 i],'color',cc(i,:));
end

MATLAB имеет 13 различных именованных цветовых карт ( 'doc colormap' перечисляет их все).

Другой вариант для построения линий в разных цветах - это использование свойства LineStyleOrder ; см. Определение цвета линий для печати в документации MATLAB для получения дополнительной информации.

105 голосов
/ 09 января 2010

На самом деле, приличный ярлык для циклического преобразования цветов должен использовать hold all; вместо hold on;. Каждый последующий plot будет вращаться (автоматически для вас) через стандартную цветовую карту MATLAB.

С сайта MATLAB по hold:

hold all содержит график и текущий цвет линии и стиль линии, чтобы последующие команды построения не сбрасывали значения свойств ColorOrder и LineStyleOrder в начало списка. Команды печати продолжают циклически проходить через предопределенные цвета и стили линий, с которых последний график остановился в списке.

32 голосов
/ 26 февраля 2014

Поздний ответ, но нужно добавить две вещи:

  • Информацию о том, как изменить свойство 'ColorOrder' и как установить глобальное значение по умолчанию с помощью 'DefaultAxesColorOrder', см. В «Приложении» внизу этого сообщения.
  • В MATLAB Central File Exchange есть отличный инструмент для генерации любого количества визуально отличных цветов, если у вас есть набор инструментов обработки изображений для его использования. Продолжайте читать для деталей.

Свойство ColorOrder axes позволяет MATLAB автоматически циклически проходить по списку цветов при использовании hold on/all (снова см. Приложение ниже, чтобы узнать, как set / get the ColorOrder для конкретной оси или глобально через DefaultAxesColorOrder). Однако по умолчанию MATLAB задает только короткий список цветов ( всего 7 по состоянию на R2013b) для циклического перехода, а с другой стороны, может быть проблематично найти хороший набор цвета для большего количества рядов данных. Для 10 участков вы явно не можете полагаться на значение по умолчанию ColorOrder.

Отличный способ определить N визуально отличных цветов с помощью «Генерировать максимально различимые для восприятия цвета» (GMPDC) на MATLAB Central File File Exchange . Лучше всего описать его собственными словами:

Эта функция генерирует набор цветов, которые можно различить по отношению к «Лабораторному» цветовому пространству , которое более точно соответствует восприятию цветов человеком, чем RGB. Учитывая исходный большой список возможных цветов, он итеративно выбирает запись в списке, которая наиболее удалена (в пространстве Lab) от всех ранее выбранных записей.

Например, когда запрашивается 25 цветов:

25

Представление GMPDC было выбрано в официальном блоге MathWorks как Пик недели в 2010 году частично из-за возможности запрашивать произвольное количество цветов (в отличие от встроенных в MATLAB 7 цветов по умолчанию) , Они даже сделали отличное предложение установить ColorOrder для MATLAB при запуске на

distinguishable_colors(20)

Конечно, вы можете установить ColorOrder для одной оси или просто сгенерировать список цветов для использования любым удобным вам способом. Например, чтобы сгенерировать 10 «максимально различимых по восприятию цветов» и использовать их для 10 графиков на одной оси (, но не с использованием ColorOrder, поэтому требуется цикл ):

% Starting with X of size N-by-P-by-2, where P is number of plots
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:size(X,2),
    plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end

Процесс упрощен, не требует цикла for, со свойством ColorOrder axis :

% X of size N-by-P-by-2
mpdc10 = distinguishable_colors(10)
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)    % --- <b>set ColorOrder HERE</b> ---
plot(X(:,:,1),X(:,:,2),'-.')   % <b>loop NOT needed, 'Color' NOT needed. Yay!</b>

ПРИЛОЖЕНИЕ

Чтобы получить массив ColorOrder RGB, используемый для текущей оси,

get(gca,'ColorOrder')

Чтобы получить значение по умолчанию ColorOrder для новых осей,

get(0,'DefaultAxesColorOrder')

Пример установки нового глобального ColorOrder с 10 цветами при запуске MATLAB, в startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
11 голосов
/ 12 июня 2012

Поздно на вечеринку. Я сам смотрел на это и только что нашел опцию осей под названием ColorOrder Вы можете указать порядок цветов для сеанса или только для фигуры, а затем просто построить массив и позволить MATLAB автоматически переключаться между указанными цветами.

см. Изменение цвета по умолчанию

пример

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
3 голосов
/ 11 января 2010

Если все векторы имеют одинаковый размер, создайте матрицу и постройте ее. Каждый столбец наносится другим цветом автоматически Затем вы можете использовать legend для обозначения столбцов:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

Или, если у вас есть ячейка с именами ядер, используйте

legend(names)
...