Автоматическое построение разноцветных линий

100

Я пытаюсь построить несколько оценок плотности ядра на одном графике, и я хочу, чтобы они были разными цветами. У меня есть 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
  • 29
    Вы пытались просто делать "держать все"? Это автоматически рисует цвета новостей для каждой новой команды заговора.
  • 2
    «Hold all» не является ответом на реальный вопрос, но может быть решением многих людей, заканчивающихся здесь, потому что просто «hold» рисует все кривые синим цветом. Большое спасибо @twerdster!
Показать ещё 6 комментариев
Теги:
matlab-figure
plot

5 ответов

121
Лучший ответ

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

  • 0
    Искал это. Будь здоров @ Азим.
  • 0
    Ради потомства, я решил принять этот ответ вместо решения @Mark Elliot's hold all из-за его универсальности выбора различных цветовых карт.
Показать ещё 1 комментарий
110

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

На сайте MATLAB на hold:

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

  • 5
    hold all должно быть объявлено устаревшим. hold on будет сохранять свою функциональность ....
31

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

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

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

Отличный способ определить N визуально различных цветов заключается в представлении Generate Perceptually-Distinct Colors (GMPDC) в центральном файле файла MATLAB Обмен. Это лучше всего описано в собственных словах автора:

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

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

Изображение 6282

Подача 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))
  • 1
    Просто примечание, для этого требуется инструмент обработки изображений.
  • 1
    @Doresoom Спасибо за информацию. Я обновил пост.
11

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

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

Пример

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
  • 0
    это то, что он сказал в своих замечаниях
  • 0
    Для одноразовой оси: set(gca,'ColorOrder',jet(5));
Показать ещё 1 комментарий
3

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

data = randn(100, 5);

figure;
plot(data);

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

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

legend(names)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню