Я пытаюсь построить несколько оценок плотности ядра на одном графике, и я хочу, чтобы они были разными цветами. У меня есть 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
Вы можете использовать цветовой набор, такой как 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 all;
вместо hold on;
. Каждый последующий plot
будет вращаться (автоматически для вас) через MATLAB по умолчанию.
На сайте MATLAB на hold
:
hold all
содержит график и текущий цвет линии и стиль линии, так что в последующих командах графика не reset значения свойств ColorOrder и LineStyleOrder в начале списка. Команды построения продолжаются циклически с помощью предопределенных цветов и стилей, где последний график останавливается в списке.
hold all
должно быть объявлено устаревшим. hold on
будет сохранять свою функциональность ....
Поздний ответ, но две вещи, которые нужно добавить:
'ColorOrder'
и как установить глобальное значение по умолчанию с помощью 'DefaultAxesColorOrder'
, см. "Приложение" внизу этого сообщения.Отличный способ определить N визуально различных цветов заключается в представлении Generate Perceptually-Distinct Colors (GMPDC) в центральном файле файла MATLAB Обмен. Это лучше всего описано в собственных словах автора:
Эта функция генерирует набор цветов, которые можно выделить с помощью цветового пространства "Лаборатория" , что более близко соответствует восприятию цвета человека, чем RGB. Учитывая первоначальный большой список возможных цветов, он итерационно выбирает запись в списке, который является самым дальним (в лабораторном пространстве) из всех ранее выбранных записей.
Например, когда запрашивается 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 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))
Поздняя вечеринка. Я изучал это сам и только что нашел об этом объекте, который называется ColorOrder вы можете указать порядок цветов для сеанса или только для фигуры, а затем просто построить массив и позволить MATLAB автоматически циклически перебирать указанные цвета.
см. Изменение ColorOrder по умолчанию
Пример
set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
set(gca,'ColorOrder',jet(5));
Если все векторы имеют одинаковый размер, создайте матрицу и запишите ее.
Каждый столбец отображается с другим цветом автоматически
Затем вы можете использовать legend
для указания столбцов:
data = randn(100, 5);
figure;
plot(data);
legend(cellstr(num2str((1:size(data,2))')))
Или, если у вас есть ячейка с именами ядер, используйте
legend(names)