Wie bekomme ich verschiedenfarbige Linien für verschiedene Diagramme in einer einzigen Figur?

202

Ich benutze matplotlib, um die Handlungen zu erstellen. Ich muss jedes Diagramm mit einer anderen Farbe identifizieren, die von Python automatisch generiert werden soll.

Können Sie mir bitte eine Methode geben, um verschiedene Farben für verschiedene Diagramme in dieselbe Figur zu setzen?

pottigopi
quelle

Antworten:

424

Matplotlib macht dies standardmäßig.

Z.B:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

Grundlegende Darstellung des Farbzyklus

Und wie Sie vielleicht bereits wissen, können Sie ganz einfach eine Legende hinzufügen:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Grundhandlung mit Legende

Wenn Sie die Farben steuern möchten, die durchlaufen werden:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Diagramm mit Kontrolle über den Standardfarbzyklus

Wenn Sie mit matplotlib nicht vertraut sind, ist das Tutorial ein guter Anfang .

Bearbeiten:

Zunächst einmal, wenn Sie viele (> 5) Dinge haben, die Sie auf einer Figur darstellen möchten, entweder:

  1. Platzieren Sie sie auf verschiedenen Plots (verwenden Sie möglicherweise einige Unterplots auf einer Figur) oder
  2. Verwenden Sie etwas anderes als Farbe (dh Markierungsstile oder Linienstärke), um zwischen ihnen zu unterscheiden.

Andernfalls werden Sie mit einer sehr chaotischen Handlung enden! Sei nett zu dem, der jemals lesen wird, was auch immer du tust, und versuche nicht, 15 verschiedene Dinge auf eine Figur zu packen !!

Darüber hinaus sind viele Menschen in unterschiedlichem Maße farbenblind, und es ist für mehr Menschen schwierig, zwischen zahlreichen subtil unterschiedlichen Farben zu unterscheiden, als Sie vielleicht denken.

Wenn Sie jedoch wirklich 20 Linien mit 20 relativ unterschiedlichen Farben auf eine Achse legen möchten, haben Sie folgende Möglichkeiten:

import matplotlib.pyplot as plt
import numpy as np

num_plots = 20

# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))

# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
    plt.plot(x, i * x + 5 * i)
    labels.append(r'$y = %ix + %i$' % (i, 5*i))

# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center', 
           bbox_to_anchor=[0.5, 1.1], 
           columnspacing=1.0, labelspacing=0.0,
           handletextpad=0.0, handlelength=1.5,
           fancybox=True, shadow=True)

plt.show()

Einzigartige Farben für 20 Linien basierend auf einer bestimmten Farbkarte

Joe Kington
quelle
17
Beachten Sie für das letzte Beispiel, dass in neueren Versionen von matplotlib das set_color_cycleveraltet ist, sodass diese Zeile sein sollte plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))und ändern Sie sie einfach plt.cm.YOUR_PREFERED_COLOR_MAPentsprechend Ihren Anforderungen.
Nate
1
@ JoeKington: Die Erklärung war wunderbar, vielen Dank
Rika
das ist toll. Gibt es eine Möglichkeit, sie interaktiv zu gestalten? Zum Beispiel in RI konvertieren Sie ggplot in ggplotly (), und der Plot wird HTML interaktiv
kRazzy R
Ich bin überzeugt, dass das OP wusste, dass Matplotlib Farben in einem einzelnen Diagramm (in einem einzelnen Diagramm axes) entsprechend unterschiedlich färbt, und fragte, ob die Farbe einer einzelnen Linie in verschiedenen Diagrammen (unterschiedlich axes) variiert werden soll. Das heißt, eine ausgezeichnete Antwort auf eine wichtige Frage (möglicherweise anders als das, was OP gestellt hat, aber niemand kann es sagen, weil sie diese einzelne Frage gestellt haben und verschwunden sind!) - +1
gboffi
37

Stellen Sie sie später ein

Wenn Sie die Anzahl der Diagramme, die Sie zeichnen möchten, nicht kennen, können Sie die Farben ändern, sobald Sie sie gezeichnet haben. Dabei verwende .linesich diese Lösung:

Einige zufällige Daten

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)


for i in range(1,15):
    ax1.plot(np.array([1,5])*i,label=i)

Der Code, den Sie benötigen:

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired   
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
    j.set_color(colors[i])
  

ax1.legend(loc=2)

Das Ergebnis ist folgendes:Geben Sie hier die Bildbeschreibung ein

GM
quelle
8

TL; DR Nein, das kann nicht automatisch gemacht werden . Ja, es ist möglich.

import matplotlib.pyplot as plt
my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))

Geben Sie hier die Bildbeschreibung ein Jedes Diagramm ( axes) in einer Abbildung ( figure) hat einen eigenen Farbzyklus. Wenn Sie nicht für jedes Diagramm eine andere Farbe erzwingen, haben alle Diagramme dieselbe Farbreihenfolge, aber wenn wir etwas strecken, bedeutet dies "automatisch" kann es getan werden.


Das OP schrieb

[...] Ich muss jedes Diagramm mit einer anderen Farbe identifizieren, die automatisch von [Matplotlib] generiert werden soll.

Aber ... Matplotlib generiert automatisch unterschiedliche Farben für jede unterschiedliche Kurve

In [10]: import numpy as np
    ...: import matplotlib.pyplot as plt

In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));
Out[11]:

Geben Sie hier die Bildbeschreibung ein

Warum also die OP-Anfrage? Wenn wir weiterlesen, haben wir

Können Sie mir bitte eine Methode geben, um verschiedene Farben für verschiedene Diagramme in dieselbe Figur zu setzen?

und es ist sinnvoll, weil jede Handlung (jede axesin Matplotlibs Sprache) ihre eigene hat color_cycle(oder besser gesagt, 2018 prop_cycle) und jede Handlung ( axes) dieselben Farben in derselben Reihenfolge wiederverwendet.

In [12]: fig, axes = plt.subplots(2,3)

In [13]: for ax in axes.flatten():
    ...:     ax.plot((0,1), (0,1))

Geben Sie hier die Bildbeschreibung ein

Wenn dies die Bedeutung der ursprünglichen Frage ist, besteht eine Möglichkeit darin, für jedes Diagramm explizit eine andere Farbe zu benennen.

Wenn die Diagramme (wie so oft) in einer Schleife generiert werden, benötigen wir eine zusätzliche Schleifenvariable, um die von Matplotlib automatisch ausgewählte Farbe zu überschreiben .

In [14]: fig, axes = plt.subplots(2,3)

In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'):
    ...:     ax.plot((0,1), (0,1), short_color_name)

Geben Sie hier die Bildbeschreibung ein

Eine andere Möglichkeit besteht darin, ein Cycler-Objekt zu instanziieren

from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()

fig, axes = plt.subplots(2,3)
for ax in axes.flat:
    ax.plot((0,1), (0,1), **next(actual_cycler))

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass type(my_cycler)ist cycler.Cycleraber type(actual_cycler)ist itertools.cycle.

gboffi
quelle
3

Ich möchte eine geringfügige Verbesserung gegenüber der letzten Schleifenantwort im vorherigen Beitrag anbieten (dieser Beitrag ist korrekt und sollte trotzdem akzeptiert werden). Die implizite Annahme, die beim Beschriften des letzten Beispiels getroffen wurde, ist, dass plt.label(LIST)die Beschriftungsnummer X in LISTdie Zeile eingefügt wird, die dem X. Mal entspricht, plotals aufgerufen wurde. Ich bin schon einmal auf Probleme mit diesem Ansatz gestoßen. Der empfohlene Weg, Legenden zu erstellen und ihre Etiketten gemäß der matplotlibs-Dokumentation ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item ) anzupassen, besteht darin, ein warmes Gefühl dafür zu haben, dass die Etiketten funktionieren zusammen mit den genauen Handlungen, von denen Sie glauben, dass sie es tun:

...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
    plotHandles.append(x)
    labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)

**: Matplotlib Legends funktionieren nicht

Tommy
quelle
3
Nur zur Info: Sie können auch das "label" kwarg verwenden, um die Legende ohne Argumente zu zeichnen und dann aufzurufen.
Joe Kington