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

112

Я пытаюсь нанести несколько оценок плотности ядра на один график и хочу, чтобы все они были разных цветов. У меня есть 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
Doresoom
источник
30
Вы пробовали просто сделать «держи все»? Это автоматически отображает цвета новостей для каждой новой команды построения графика.
twerdster
3
«держать все» не является ответом на фактический вопрос, но может быть решением для многих людей, заканчивающих здесь, потому что простое «удержание» рисует все кривые синим цветом. Большое спасибо @twerdster!
Реми
8
По состоянию R2014b , обычный hold onявляется функционально эквивалентны в hold all. Однако остается вопрос, как получить больше 7 цветов по умолчанию. Цветовая карта по умолчанию может быть решением, описанным Азимом, или может использоваться функция для генерации цветов, настроенных для легкого визуального различения, как показано ниже .
chappjc
1
Когда я использую, hold allя получаю графики разных цветов (хотя я должен сказать, что они выглядят довольно скучно), тогда как когда я использую hold on, все мои графики становятся синими. Поэтому мне интересно, что такое функциональная эквивалентность.
HelloGoodbye
4
@HelloGoodbye В R2014b и новее hold onвыдает разные цвета. Вы используете и более старую версию. В текущих документах " hold allсовпадает с hold on. Примечание. Этот синтаксис будет удален в следующем выпуске. Используйте hold onвместо него". См. Также примечания к выпуску .
chappjc

Ответы:

131

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

Азим
источник
Искал это. Будь здоров @Azim.
профессор
Ради потомков я решил принять этот ответ вместо hold allрешения @Mark Elliot из-за его универсальности, позволяющей выбирать разные цветовые карты.
Doresoom
Как я могу заставить его работать, используя команду "line" plot вместо plot?
Pedro77
106

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

С сайта MATLAB на hold:

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

Марк Эллиот
источник
36

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

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

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

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

Эта функция генерирует набор цветов, которые можно различить по цветовому пространству "Lab" , которое более точно соответствует восприятию цвета человеком, чем 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 размера N-by-P-by-2
mpdc10 = различимые_цвета (10)
ha = оси; держать (ха, 'на')
set (ha, 'ColorOrder', mpdc10)% --- установите ColorOrder ЗДЕСЬ ---
plot (X (:,:, 1), X (:,:, 2), '-.')% loop НЕ нужен, 'Color' НЕ нужен. Ура!

ПРИЛОЖЕНИЕ

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

get(gca,'ColorOrder')

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

get(0,'DefaultAxesColorOrder')

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

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

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

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

пример

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
xquared
источник
1
Для разовой оси:set(gca,'ColorOrder',jet(5));
Евгений Сергеев
1
отлично подходит только для информирования о джете (номере), который не требует каких-либо навороченных
ящиков с
4

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

data = randn(100, 5);

figure;
plot(data);

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

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

legend(names)
Serg
источник