Automatycznie rysuj różne kolorowe linie

112

Próbuję narysować kilka oszacowań gęstości jądra na tym samym wykresie i chcę, aby wszystkie miały różne kolory. Mam rozwiązanie wykorzystujące ciąg znaków 'rgbcmyk'i przechodzące przez niego dla każdego oddzielnego wykresu, ale zaczynam mieć duplikaty po 7 iteracjach. Czy jest na to łatwiejszy / wydajniejszy sposób i więcej opcji kolorów?

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
Doresoom
źródło
30
Czy próbowałeś po prostu zrobić „wstrzymaj wszystko”? To automatycznie rysuje kolory wiadomości dla każdego nowego polecenia wykresu.
twerdster
3
„Trzymaj wszystko” nie jest odpowiedzią na rzeczywiste pytanie, ale może być rozwiązaniem dla wielu ludzi kończących tutaj, ponieważ zwykłe „trzymaj się” rysuje wszystkie krzywe na niebiesko. Wielkie podziękowania dla @twerdster!
Rémi
8
Od R2014b zwykłe hold onjest funkcjonalnie równoważne z hold all. Pozostaje jednak pytanie, jak uzyskać więcej niż 7 domyślnych kolorów. Domyślna mapa kolorów może być rozwiązaniem opisanym przez Azima lub można zastosować funkcję generowania kolorów dostrojonych w celu łatwej dyskryminacji wizualnej, jak poniżej .
chappjc
1
Kiedy używam hold all, otrzymuję wykresy w różnych kolorach (chociaż muszę powiedzieć, że wyglądają dość nudno), podczas gdy kiedy używam hold on, wszystkie moje wykresy stają się niebieskie. Zastanawiam się więc, czym jest równoważność funkcjonalna.
HelloGoodbye
4
@HelloGoodbye W R2014b i nowszych hold ondaje różne wykresy kolorów. Używasz i starszej wersji. W bieżącej dokumentacjihold alljest taki sam jak hold on. Uwaga: ta składnia zostanie usunięta w przyszłej wersji. hold onZamiast tego użyj ”. Zobacz także informacje o wersji .
chappjc

Odpowiedzi:

131

Możesz użyć mapy kolorów, takiej jak HSV, do wygenerowania zestawu kolorów. Na przykład:

cc=hsv(12);
figure; 
hold on;
for i=1:12
    plot([0 1],[0 i],'color',cc(i,:));
end

MATLAB ma 13 różnych nazwanych map kolorów ( „mapa kolorów doc” wymienia je wszystkie).

Inną opcją kreślenia linii w różnych kolorach jest użycie właściwości LineStyleOrder ; zobacz Definiowanie koloru linii do kreślenia w dokumentacji MATLAB, aby uzyskać więcej informacji.

Azim
źródło
Szukałem tego. Bądź zdrowy @Azim.
profesor
Ze względu na potomstwo zdecydowałem się zaakceptować tę odpowiedź zamiast hold allrozwiązania @Mark Elliot ze względu na jego wszechstronność polegającą na możliwości wyboru różnych map kolorów.
Doresoom
Jak sprawić, by działało przy użyciu polecenia „line” plot zamiast polecenia plot?
Pedro77
106

Właściwie przyzwoitą metodą skrótu do przełączania kolorów jest użycie hold all;zamiast hold on;. Każdy kolejny plotbędzie się obracał (automatycznie dla ciebie) przez domyślną mapę kolorów MATLAB.

Ze strony MATLAB na hold:

hold allprzechowuje wykres oraz bieżący kolor i styl linii, aby kolejne polecenia drukowania nie resetowały wartości właściwości ColorOrder i LineStyleOrder do początku listy. Polecenia kreślenia kontynuują cykliczne przechodzenie przez predefiniowane kolory i style linii od miejsca, w którym zakończył się ostatni wydruk na liście.

Mark Elliot
źródło
36

Późna odpowiedź, ale dwie rzeczy do dodania:

  • Aby uzyskać informacje o tym, jak zmienić 'ColorOrder'właściwość i ustawić globalną wartość domyślną za pomocą 'DefaultAxesColorOrder', zobacz „Dodatek” na dole tego posta.
  • W centralnej wymianie plików MATLAB znajduje się świetne narzędzie do generowania dowolnej liczby wizualnie różnych kolorów, jeśli masz zestaw narzędzi do przetwarzania obrazu, który go używa. Przeczytaj szczegóły.

Ta ColorOrder axeswłaściwość umożliwia MATLAB-owi automatyczne przełączanie listy kolorów podczas używania hold on/all(ponownie, zobacz Dodatek poniżej, aby dowiedzieć się, jak set/ geta ColorOrderdla określonej osi lub globalnie przez DefaultAxesColorOrder). Jednak domyślnie MATLAB określa tylko krótką listę kolorów ( tylko 7 od R2013b) do przełączenia , az drugiej strony znalezienie dobrego zestawu kolorów dla większej liczby serii danych może być problematyczne. W przypadku 10 działek oczywiście nie można polegać na wartości domyślnej ColorOrder.

Świetnym sposobem na zdefiniowanie N wizualnie odrębnych kolorów jest przesłanie „Generuj maksymalnie percepcyjnie odróżniające się kolory” (GMPDC) w centralnej wymianie plików MATLAB . Najlepiej można to opisać własnymi słowami autora:

Ta funkcja generuje zestaw kolorów, które można rozróżnić na podstawie przestrzeni kolorów „Lab” , która jest bardziej zgodna z postrzeganiem kolorów przez człowieka niż RGB. Biorąc pod uwagę początkową dużą listę możliwych kolorów, iteracyjnie wybiera wpis na liście, który jest najdalszy (w przestrzeni laboratorium) ze wszystkich wcześniej wybranych wpisów.

Na przykład, gdy wymagane jest 25 kolorów:

25 „kolorów maksymalnie wyrazistych percepcyjnie”

Zgłoszenie GMPDC zostało wybrane na oficjalnym blogu MathWorks jako Pick of the Week w 2010, po części ze względu na możliwość zażądania dowolnej liczby kolorów (w przeciwieństwie do MATLAB-ów zbudowanych w 7 domyślnych kolorach). Zrobili nawet doskonałą sugestię, aby ustawić MATLAB ColorOrderna starcie na,

distinguishable_colors(20)

Oczywiście możesz ustawić ColorOrderdla pojedynczej osi lub po prostu wygenerować listę kolorów do użycia w dowolny sposób. Na przykład, aby wygenerować 10 „maksymalnie percepcyjnie różnych kolorów” i użyć ich na 10 wykresach na tej samej osi ( ale bez użycia ColorOrder, co wymaga pętli ):

% 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

Proces jest uproszczony, nie wymaga forpętli, z ColorOrderwłaściwością axis :

% X rozmiaru N na P na 2
mpdc10 = odróżnialne_ kolory (10)
ha = osie; przytrzymaj (ha, 'włączony')
set (ha, 'ColorOrder', mpdc10)% --- ustaw ColorOrder TUTAJ ---
plot (X (:,:, 1), X (:,:, 2), '-.')% pętla NIE jest potrzebna, 'Kolor' NIE jest potrzebna. Yay!

DODATEK

Aby uzyskać ColorOrdertablicę RGB używaną dla bieżącej osi,

get(gca,'ColorOrder')

Aby uzyskać ustawienia domyślne ColorOrderdla nowych osi,

get(0,'DefaultAxesColorOrder')

Przykład ustawienia nowego globalnego ColorOrderz 10 kolorami na starcie MATLAB, w startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
chappjc
źródło
2
Uwaga, wydaje się, że wymaga to zestawu narzędzi do przetwarzania obrazu.
Doresoom
2
@Doresoom Dzięki za informację. Zaktualizowałem post.
chappjc
12

Spóźniony na przyjęcie. Sam się temu przyglądałem i właśnie znalazłem tę opcję osi o nazwie ColorOrder, możesz określić kolejność kolorów dla sesji lub tylko dla figury, a następnie po prostu wykreśl tablicę i pozwól MATLABowi automatycznie przełączać się przez określone kolory.

zobacz Zmiana domyślnego zamówienia kolorów

przykład

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
xquared
źródło
1
Dla jednorazowej osi:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev
1
doskonały tylko do informowania o jet (numerze), który nie wymaga żadnych wymyślnych skrzynek narzędziowych
crobar
4

Jeśli wszystkie wektory mają równe rozmiary, utwórz macierz i wykreśl ją. Każda kolumna jest automatycznie wykreślana innym kolorem. Następnie możesz użyć legenddo wskazania kolumn:

data = randn(100, 5);

figure;
plot(data);

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

Lub, jeśli masz komórkę z nazwami jądra, użyj

legend(names)
Serg
źródło