Автоматично намічайте різні кольорові лінії


112

Я намагаюся побудувати на одному графіку кілька оцінок щільності ядра, і я хочу, щоб вони були різного кольору. У мене є розв'язане рішення, що використовує рядок '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

30
Ви намагалися просто робити "утримувати всіх"? Це автоматично малює кольори новин для кожної нової команди сюжету.
twerdster

3
"затримати всіх" - це не відповідь на власне питання, але може бути вирішенням багатьох людей, які закінчуються тут, тому що просто "тримання" малює всі криві синім кольором. Дякую @twerdster!
Ремі

8
Станом R2014b , звичайний hold onє функціонально еквівалентні в hold all. Однак питання, як отримати більше 7 кольорів за замовчуванням, залишається. Кольорова карта за замовчуванням може бути рішенням, як описано Azim, або може використовуватися функція для створення кольорів, налаштованих для легкої візуальної дискримінації, як показано нижче .
chappjc

1
Під час використання hold allя отримую сюжети в різних кольорах (хоча потрібно сказати, що вони виглядають досить тьмяно), тоді як коли я використовую hold on, всі мої ділянки стають синіми. Тож мені цікаво, що таке функціональна еквівалентність.
HelloGoodbye

4
@HelloGoodbye У R2014b та новіших версіях надаються hold onрізні кольорові сюжети. Ви використовуєте і старішу версію. З поточних документів " hold allце те саме, що hold on. Примітка. Цей синтаксис буде видалено в майбутньому випуску. Використовуйте hold onзамість цього." Дивіться також примітки до випуску .
chappjc

Відповіді:


131

Ви можете використовувати кольорову карту, наприклад 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 для отримання додаткової інформації.


Шукав його. Будь добре @Azim.
професор

Заради нащадків я вирішив прийняти цю відповідь через рішення @Mark Elliot hold allчерез його універсальність того, що можна було вибирати різні кольорові карти.
Doresoom

Як я можу змусити його працювати, використовуючи команду "line" plot замість сюжету?
Pedro77

106

Насправді, гідний метод швидкого доступу для отримання кольорів в циклі - це використовувати hold all;замість hold on;. Кожен наступний plotбуде обертатися (автоматично для вас) за допомогою кольорової карти MATLAB за замовчуванням.

З сайту MATLAB на hold:

hold allутримує графік та поточний колір лінії та стиль лінії, щоб наступні команди графіку не скидали значення властивостей ColorOrder та LineStyleOrder на початок списку. Команди графіки продовжують пересуватись заздалегідь заданими кольорами та стилями, звідки в списку зупинився останній сюжет.


36

Пізня відповідь, але додати дві речі:

  • Інформацію про те, як змінити 'ColorOrder'властивість та як встановити глобальний стандарт за замовчуванням 'DefaultAxesColorOrder', дивіться "Додаток" внизу цієї публікації.
  • На центральній біржі файлів MATLAB є чудовий інструмент для генерації будь-якої кількості візуально відмінних кольорів, якщо у вас є інструмент обробки зображень для його використання. Детальніше читайте далі.

ColorOrder axesВластивість дозволяє MATLAB для автоматичного циклу через список квітів при використанні hold on/all(знову ж , див додаток нижче, як set/ для осі конкретної або глобально через ). Однак за замовчуванням MATLAB задає лише короткий список кольорів ( всього 7 на R2013b), щоб пройти цикл, а з іншого боку, може бути проблематичним знайти хороший набір кольорів для більшої кількості даних. Для 10 сюжетів ви, очевидно, не можете покластися на дефолт .getColorOrderDefaultAxesColorOrderColorOrder

Чудовим способом визначення N візуально відмінних кольорів є подання "Створення максимально перцептивно-чітких кольорів" (GMPDC) на центральному файловому обміні файлів MATLAB . Найкраще це описано власними словами автора:

Ця функція генерує набір кольорів, які можна відрізнити за посиланням на кольоровий простір "Лабораторія" , який більше відповідає людському сприйняттю кольорів, ніж RGB. З огляду на початковий великий список можливих кольорів, він ітеративно вибирає запис у списку, який є найдальшим (у просторі лабораторії) з усіх раніше обраних записів.

Наприклад, коли запитується 25 кольорів:

25 "кольорів, максимально сприйнятих"

Подання GMPDC було обрано на офіційному блозі MathWorks як Pick of the Week 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 розміром N-на-P-на-2
mpdc10 = відмінні_кольори (10)
ha = осі; утримувати (га, 'у')
набір (га, 'ColorOrder', mpdc10)% --- встановити ColorOrder ТУТ ---
ділянка (X (:,:, 1), X (:,:, 2), '-.')% цикл НЕ потрібен, 'Color' НЕ потрібен. Так!

ДОДАТОК

Щоб отримати ColorOrderмасив RGB, використовуваний для поточної осі,

get(gca,'ColorOrder')

Щоб отримати за замовчуванням ColorOrderдля нових осей,

get(0,'DefaultAxesColorOrder')

Приклад встановлення нового глобального ColorOrderз 10 кольорами на початку MATLAB, у startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))

2
Лише зауваження, для цього, здається, потрібна панель інструментів для обробки зображень.
Doresoom

2
@Doresoom Дякую за інформацію. Я оновив публікацію.
chappjc

12

Пізно на вечірку. Я сам розглядав це і щойно дізнався про цю опцію осей під назвою ColorOrder, ви можете вказати порядок кольорів для сеансу або просто для фігури, а потім просто побудувати масив і дозволити MATLAB автоматично переходити через вказані кольори.

див. Зміна кольорового замовлення за замовчуванням

приклад

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

1
Для разової осі:set(gca,'ColorOrder',jet(5));
Євгеній Сергєєв

1
відмінно підходить для інформування про струмінь (номер), який не потребує фантазійних
наборів

4

Якщо всі вектори мають однаковий розмір, створіть матрицю та побудуйте її. Кожен стовпець автоматично накреслюється іншим кольором. Потім ви можете legendвказати стовпці:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

Або якщо у вас є клітинка з іменами ядер, використовуйте

legend(names)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.