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


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

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 для получения дополнительной информации.

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

С сайта MATLAB на hold:

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

поздний ответ, но две вещи добавить:

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

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

отличный способ определить N визуально различных цветов С " генерировать максимально различимые цвета " (GMPDC) представление на MATLAB Central File file Exchange. Лучше всего это описано собственными словами автора:

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

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

25 "maximally perceptually-distinct colors"

представление GMPDC была выбрана в официальном блоге компании MathWorks в качестве выбор недели в 2010 году отчасти из-за возможности запрашивать произвольное количество цветов (в отличие от MATLAB построен в 7 цветах по умолчанию). Они даже сделали отличное предложение установить MATLAB's 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))

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

посмотреть изменение порядка цветов по умолчанию

пример

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

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

data = randn(100, 5);

figure;
plot(data);

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

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

legend(names)