Автоматическое построение различных цветных линий
Я пытаюсь построить несколько оценок плотности ядра на одном графике, и я хочу, чтобы все они были разных цветов. У меня есть 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,:)); 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
ColorOrder
axes
собственность позволяет MATLAB автоматически перебирать список цветов при использованииhold on/all
(опять же, см. Приложение ниже для того, какset
/get
theColorOrder
для определенной оси или глобально через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)