Автоматическое построение различных цветных линий
Я пытаюсь построить несколько оценок плотности ядра на одном графике, и я хочу, чтобы все они были разных цветов. У меня есть 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 ответов:
вы можете использовать цветовую карту, такую как HSV, для создания набора цветов. Например:
cc=hsv(12); figure; hold on; for i=1:12 plot([0 1],[0 i],'color',cc(i,:)); endMATLAB имеет 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/gettheColorOrderдля определенной оси или глобально черезDefaultAxesColorOrder). Однако, по умолчанию MATLAB определяет только короткий список цветов (Просто 7 по состоянию на R2013b) для циклического прохождения, а с другой стороны, может быть проблематично найти хороший набор цветов для большего количества рядов данных. Для 10 участков Вы, очевидно, не можете полагаться значение по умолчаниюColorOrder.отличный способ определить N визуально различных цветов С " генерировать максимально различимые цвета " (GMPDC) представление на MATLAB Central File file Exchange. Лучше всего это описано собственными словами автора:
эта функция генерирует набор цветов, которые различимы по ссылке на "Лаборатория" цветовое пространство, который более близко соответствует человеческому цвету восприятие чем РГБ. Учитывая начальный большой список возможных цветов, он итеративно выбирает запись в списке, которая является самой дальней (в лабораторном пространстве) из всех ранее выбранных записей.
например, когда запрашивается 25 цветов:
представление 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)
