Автоматически строить линии разного цвета

Я пытаюсь построить несколько оценок плотности ядра на одном графике и хочу, чтобы все они были разных цветов. У меня есть 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

person Doresoom    schedule 08.01.2010    source источник
comment
Вы пробовали просто держать всех? Это автоматически отображает цвета новостей для каждой новой команды построения графика.   -  person twerdster    schedule 16.12.2011
comment
«Держать все» не является ответом на реальный вопрос, но может быть решением для многих людей, которые заканчивают здесь, потому что простое удержание рисует все кривые синим цветом. Большое спасибо @twerdster!   -  person Rémi    schedule 21.10.2013
comment
Начиная с R2014b, обычный hold on функционально эквивалентен hold all. Однако остается вопрос, как получить больше 7 цветов по умолчанию. Цветовая карта по умолчанию может быть решением, описанным Азимом, или может использоваться функция для генерации цветов, настроенная для легкого визуального различения, как показано ниже < / а>.   -  person chappjc    schedule 25.10.2014
comment
Когда я использую hold all, я получаю графики разных цветов (хотя я должен сказать, что они выглядят довольно скучно), тогда как когда я использую hold on, все мои графики становятся синими. Так что мне интересно, что такое функциональная эквивалентность.   -  person HelloGoodbye    schedule 16.03.2015
comment
@HelloGoodbye hold on просто предотвращает стирание MATLAB предыдущих графиков при выполнении нового вызова plot. hold all также назначает новые атрибуты для последующих вызовов построения графика.   -  person Doresoom    schedule 16.03.2015
comment
@HelloGoodbye В R2014b и новее hold on дает разные цветовые диаграммы. Вы используете и более старую версию. Из текущих документов hold all совпадает с hold on. Примечание. Этот синтаксис будет удален в следующем выпуске. Вместо этого используйте hold on. См. Также примечания к выпуску.   -  person chappjc    schedule 16.03.2015
comment
@HelloGoodbye Единственный случай, когда будет иметь место предыдущее поведение, - это если graphicsversion('handlegraphics') вернет true, указывая на то, что MATLAB работает со старой графической системой дескрипторов.   -  person chappjc    schedule 16.03.2015
comment
@chappjc Ах! Спасибо! Да, моя версия Matlab может быть не самой новой.   -  person HelloGoodbye    schedule 17.03.2015


Ответы (5)


Вы можете использовать цветовую карту, такую ​​как 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 для больше информации.

person Azim J    schedule 08.01.2010
comment
Искал это. Будь здоров @Azim. - person professor; 02.12.2012
comment
Ради потомков я решил принять этот ответ вместо решения @Mark Elliot hold all из-за его универсальности, позволяющей выбирать разные цветовые карты. - person Doresoom; 16.03.2015
comment
Как я могу заставить его работать, используя команду линейного построения вместо графика? - person Pedro77; 30.11.2016

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

С сайта MATLAB на hold:

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

person Mark Elliot    schedule 09.01.2010

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

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

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

Отличный способ определить N визуально различных цветов - использовать «Сгенерируйте максимально воспринимаемые цвета» (GMPDC), представленные на центральном файловом обмене файлов MATLAB. Лучше всего это описать собственными словами автора:

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

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

25 максимально различимых для восприятия цветов

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

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:

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

ПРИЛОЖЕНИЕ

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

get(gca,'ColorOrder')

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

get(0,'DefaultAxesColorOrder')

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

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
person chappjc    schedule 26.02.2014
comment
Просто примечание, для этого, похоже, требуется Панель инструментов обработки изображений. - person Doresoom; 16.03.2015
comment
@Doresoom Спасибо за информацию. Я обновил пост. - person chappjc; 16.03.2015

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

см. Изменение ColorOrder по умолчанию

пример

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
person xquared    schedule 12.06.2012
comment
Для одноразовой оси: set(gca,'ColorOrder',jet(5)); - person Evgeni Sergeev; 30.09.2013
comment
отлично подходит только для информирования о жиклере (номере), не требующем каких-либо навороченных ящиков с инструментами - person crobar; 06.05.2015

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

data = randn(100, 5);

figure;
plot(data);

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

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

legend(names)
person Serg    schedule 11.01.2010