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

StackOverflow https://stackoverflow.com/questions/2028818

  •  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 цветов:

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)    % --- установите порядок цветов ЗДЕСЬ ---
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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top