Zeichnen Sie automatisch verschiedenfarbige Linien

112

Ich versuche, mehrere Kernel-Dichteschätzungen in demselben Diagramm darzustellen, und ich möchte, dass sie alle unterschiedliche Farben haben. Ich habe eine kludged Lösung, die einen String verwendet 'rgbcmyk'und für jeden einzelnen Plot durchläuft, aber nach 7 Iterationen habe ich Duplikate. Gibt es eine einfachere / effizientere Möglichkeit, dies mit mehr Farboptionen zu tun?

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
quelle
30
Haben Sie versucht, einfach "Alles halten" zu tun? Dadurch werden automatisch Nachrichtenfarben für jeden neuen Plotbefehl gezeichnet.
Twerdster
3
"Alles halten" ist keine Antwort auf die eigentliche Frage, kann aber eine Lösung für viele Menschen sein, die hier enden, weil ein bloßes "Halten" alle Kurven in Blau zeichnet. Vielen Dank an @twerdster!
Rémi
8
Ab R2014b die übliche hold onist funktional äquivalent zu hold all. Es bleibt jedoch die Frage, wie mehr als die 7 Standardfarben erhalten werden können. Eine Standardfarbkarte kann eine von Azim beschriebene Lösung sein oder eine Funktion zum Erzeugen von Farben, die für eine einfache visuelle Unterscheidung abgestimmt sind, kann wie unten verwendet werden .
Chappjc
1
Wenn ich benutze, hold allbekomme ich Diagramme in verschiedenen Farben (obwohl ich sagen muss, dass sie ziemlich langweilig aussehen), während bei der Verwendung hold onalle meine Diagramme blau werden. Ich frage mich also, was funktionale Äquivalenz ist.
HelloGoodbye
4
@HelloGoodbye In R2014b und neueren Versionen werden hold onverschiedene Farbdiagramme angezeigt . Sie verwenden eine ältere Version. In den aktuellen Dokumenten ist " hold alldasselbe wie hold on. Hinweis: Diese Syntax wird in einer zukünftigen Version entfernt. Verwenden Sie hold onstattdessen." Siehe auch die Versionshinweise .
Chappjc

Antworten:

131

Sie können eine Farbkarte wie HSV verwenden, um eine Reihe von Farben zu generieren. Beispielsweise:

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

MATLAB hat 13 verschiedene benannte Farbkarten ( 'doc colormap' listet sie alle auf).

Eine weitere Option zum Zeichnen von Linien in verschiedenen Farben ist die Verwendung der LineStyleOrder- Eigenschaft. Weitere Informationen finden Sie unter Definieren der Farbe von Linien zum Plotten in der MATLAB-Dokumentation.

Azim
quelle
Ich habe danach gesucht. Sei gesund @Azim.
Professor
Aus Gründen der Nachwelt habe ich mich entschieden, diese Antwort gegenüber der hold allLösung von @Mark Elliot zu akzeptieren, da es vielseitig ist, verschiedene Farbkarten auswählen zu können.
Doresoom
Wie kann ich dafür sorgen, dass der Befehl "line" anstelle des Plots verwendet wird?
Pedro77
106

Tatsächlich ist eine anständige Abkürzungsmethode, um die Farben zum Zyklus zu bringen, die Verwendung hold all;von anstelle von hold on;. Jede Folge plotwird (automatisch für Sie) durch die Standard-Farbkarte von MATLAB gedreht.

Von der MATLAB-Website auf hold:

hold allEnthält das Diagramm sowie die aktuelle Linienfarbe und den aktuellen Linienstil, sodass nachfolgende Plotbefehle die Eigenschaftswerte ColorOrder und LineStyleOrder nicht an den Anfang der Liste zurücksetzen. Plotbefehle durchlaufen weiterhin die vordefinierten Farben und Linienstile, von denen aus das letzte Plot in der Liste gestoppt wurde.

Mark Elliot
quelle
36

Späte Antwort, aber zwei Dinge hinzuzufügen:

  • Informationen zum Ändern der 'ColorOrder'Eigenschaft und zum Festlegen eines globalen Standards 'DefaultAxesColorOrder'finden Sie im "Anhang" am Ende dieses Beitrags.
  • In MATLAB Central File Exchange gibt es ein großartiges Tool zum Generieren einer beliebigen Anzahl von visuell unterschiedlichen Farben, wenn Sie über die Bildverarbeitungs-Toolbox verfügen, um diese zu verwenden. Lesen Sie weiter für Details.

Die ColorOrder axesEigenschaft ermöglicht MATLAB automatisch Zyklus durch eine Liste von Farben bei der Verwendung von hold on/all(wieder, siehe Anhang unten , wie man set/ getdie ColorOrderfür eine bestimmte Achse oder global über DefaultAxesColorOrder). Standardmäßig gibt MATLAB jedoch nur eine kurze Liste von Farben an ( nur 7 ab R2013b) , die durchlaufen werden sollen. Andererseits kann es problematisch sein, einen guten Satz von Farben für mehr Datenreihen zu finden. Bei 10 Plots können Sie sich offensichtlich nicht auf die Standardeinstellung verlassen ColorOrder.

Eine gute Möglichkeit , N visuell unterschiedliche Farben zu definieren, ist die GMPDC-Übermittlung "Generate Maximally Perceptually Distinct Colors" im MATLAB Central File File Exchange . Es wird am besten mit den eigenen Worten des Autors beschrieben:

Diese Funktion erzeugt eine Reihe von Farben, die anhand des "Lab" -Farbraums unterscheidbar sind , der der menschlichen Farbwahrnehmung besser entspricht als RGB. Bei einer anfänglich großen Liste möglicher Farben wird iterativ der Eintrag in der Liste ausgewählt, der am weitesten (im Laborbereich) von allen zuvor ausgewählten Einträgen entfernt ist.

Zum Beispiel, wenn 25 Farben angefordert werden:

25 "maximal wahrnehmungsmäßig unterschiedliche Farben"

Die GMPDC-Einreichung wurde im offiziellen Blog von MathWorks 2010 als Auswahl der Woche ausgewählt, unter anderem aufgrund der Möglichkeit, eine beliebige Anzahl von Farben anzufordern (im Gegensatz zu MATLABs in 7 Standardfarben). Sie machten sogar den ausgezeichneten Vorschlag, MATLABs beim ColorOrderStart auf zu setzen,

distinguishable_colors(20)

Natürlich können Sie die ColorOrderfür eine einzelne Achse festlegen oder einfach eine Liste von Farben erstellen, die Sie nach Belieben verwenden können. Zum Beispiel, um 10 "maximal wahrnehmungsmäßig unterschiedliche Farben" zu erzeugen und sie für 10 Diagramme auf derselben Achse zu verwenden ( aber nicht zu verwenden ColorOrder, wodurch eine Schleife erforderlich ist ):

% 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

Der Prozess wird mit der Eigenschaft axis vereinfacht und erfordert keine forSchleifeColorOrder :

% X der Größe N-mal-P-mal-2
mpdc10 = unterscheidbare Farben (10)
ha = Achsen; halten (ha, 'on')
set (ha, 'ColorOrder', mpdc10)% --- setze ColorOrder HIER ---
Plot (X (:,:, 1), X (:,:, 2), '-.')% Schleife NICHT benötigt, 'Farbe' NICHT benötigt. Yay!

BLINDDARM

Um das ColorOrderfür die aktuelle Achse verwendete RGB-Array abzurufen,

get(gca,'ColorOrder')

Um die Standardeinstellung ColorOrderfür neue Achsen zu erhalten,

get(0,'DefaultAxesColorOrder')

Beispiel für das Festlegen eines neuen globalen Bereichs ColorOrdermit 10 Farben beim Start von MATLAB in startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
chappjc
quelle
2
Nur eine Anmerkung, dies scheint die Bildverarbeitungs-Toolbox zu erfordern.
Doresoom
2
@Doresoom Danke für die Info. Ich habe den Beitrag aktualisiert.
Chappjc
12

Spät zur Party. Ich habe mich selbst damit befasst und habe gerade über diese Achsenoption namens ColorOrder herausgefunden, dass Sie die Farbreihenfolge für die Sitzung oder nur für die Figur angeben und dann einfach ein Array zeichnen und MATLAB automatisch durch die angegebenen Farben blättern lassen können.

Siehe Ändern des Standard-ColorOrders

Beispiel

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
xquared
quelle
1
Für eine einmalige Achse:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev
1
Hervorragend
geeignet
4

Wenn alle Vektoren gleich groß sind, erstellen Sie eine Matrix und zeichnen Sie sie. Jede Spalte wird automatisch mit einer anderen Farbe gezeichnet. Anschließend können Sie legendSpalten angeben:

data = randn(100, 5);

figure;
plot(data);

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

Oder verwenden Sie, wenn Sie eine Zelle mit Kernelnamen haben

legend(names)
Serg
quelle