Автоматическое построение линий разного цвета
-
19-09-2019 - |
Вопрос
Я пытаюсь построить несколько оценок плотности ядра на одном графике, и я хочу, чтобы все они были разного цвета.У меня есть запутанное решение, использующее строку '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 различных именованных цветовых карт ('цветовая карта документа' перечисляет их все).
Другим вариантом построения линий разных цветов является использование Порядок линейных стилей свойство;видишь Определение цвета линий для построения графика дополнительную информацию смотрите в документации MATLAB.
Другие советы
На самом деле, достойный быстрый способ для циклирования цветов - это использовать hold all;
на месте hold on;
.Каждый последующий plot
будет вращаться (автоматически для вас) по цветовой карте MATLAB по умолчанию.
С сайта MATLAB на hold
:
hold all
сохраняет график и текущий цвет линии и стиль линии, чтобы последующие команды построения не приводили к сбросу значений свойств ColorOrder и LineStyleOrder в начало списка.Команды построения продолжают циклический переход к предопределенным цветам и стилям линий с того места, где остановился последний график в списке.
Поздний ответ, но нужно добавить две вещи:
- Для получения информации о том, как изменить
'ColorOrder'
свойство и как установить глобальное значение по умолчанию с помощью'DefaultAxesColorOrder'
, смотрите "Приложение" внизу этого поста. - В MATLAB Central File Exchange есть отличный инструмент для генерации любого количества визуально различимых цветов, если у вас есть набор инструментов обработки изображений, чтобы использовать его.Читайте дальше для получения подробной информации.
В ColorOrder
axes
свойство позволяет MATLAB автоматически циклически просматривать список цветов при использовании hold on/all
(опять же, смотрите Приложение ниже о том, как set
/get
в ColorOrder
для определенной оси или глобально через DefaultAxesColorOrder
).Однако по умолчанию MATLAB указывает только короткий список цветов (всего 7 по состоянию на R2013b) для циклического просмотра, а с другой стороны, может быть проблематично найти хороший набор цветов для большего количества рядов данных.Для 10 графиков вы, очевидно, не можете полагаться на значение по умолчанию ColorOrder
.
Отличный способ определите N визуально различимых цветов находится с Отправка "Генерировать максимально различимые для восприятия цвета" (GMPDC) на центральный файлообменник MATLAB.Лучше всего это описано собственными словами автора:
Эта функция генерирует набор цветов, которые различимы по ссылке на Цветовое пространство "Лаборатории", который более точно соответствует человеческому восприятию цвета, чем RGB.Учитывая начальный большой список возможных цветов, он итеративно выбирает запись в списке, которая находится дальше всего (в лабораторном пространстве) от всех ранее выбранных записей.
Например, когда запрашивается 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) % --- установите порядок цветов ЗДЕСЬ --- plot(X(:,:,1),X(:,:,2),'-.') % цикл НЕ нужен, "Цвет" НЕ нужен.Ура!
ПРИЛОЖЕНИЕ
Чтобы получить 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)