Streudiagramm und Farbzuordnung in Python

90

Ich habe eine Reihe von Punkten x und y in numpy Arrays gespeichert. Diese repräsentieren x (t) und y (t) mit t = 0 ... T-1

Ich zeichne ein Streudiagramm mit

import matplotlib.pyplot as plt

plt.scatter(x,y)
plt.show()

Ich hätte gerne eine Farbkarte, die die Zeit darstellt (daher werden die Punkte abhängig vom Index in den Numpy-Arrays eingefärbt).

Was ist der einfachste Weg, dies zu tun?

Vincent
quelle

Antworten:

165

Hier ist ein Beispiel

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(100)
y = np.random.rand(100)
t = np.arange(100)

plt.scatter(x, y, c=t)
plt.show()

Hier legen Sie die Farbe basierend auf dem Index fest t, der nur ein Array von ist [1, 2, ..., 100]. Geben Sie hier die Bildbeschreibung ein

Vielleicht ist ein leichter zu verstehendes Beispiel das etwas einfachere

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t)
plt.show()

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass das Array, als cdas Sie übergeben , keine bestimmte Reihenfolge oder einen bestimmten Typ haben muss, dh nicht wie in diesen Beispielen sortiert oder ganzzahlig sein muss. Die Plotroutine skaliert die Farbkarte so, dass die minimalen / maximalen Werte in cdem unteren / oberen Rand der Farbkarte entsprechen.

Farbkarten

Sie können die Farbkarte durch Hinzufügen ändern

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.cmap_name)

Der Import matplotlib.cmist optional, da Sie auch Farbkarten aufrufen können cmap="cmap_name". Es gibt eine Referenzseite mit Farbkarten, die zeigen, wie die einzelnen Karten aussehen. Beachten Sie auch, dass Sie eine Farbkarte umkehren können, indem Sie sie einfach als aufrufen cmap_name_r. Also entweder

plt.scatter(x, y, c=t, cmap=cm.cmap_name_r)
# or
plt.scatter(x, y, c=t, cmap="cmap_name_r")

wird funktionieren. Beispiele sind "jet_r"oder cm.plasma_r. Hier ist ein Beispiel mit der neuen 1.5 colormap viridis:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
plt.show()

Geben Sie hier die Bildbeschreibung ein

Farbleisten

Sie können eine Farbleiste hinzufügen, indem Sie verwenden

plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()

Geben Sie hier die Bildbeschreibung ein

Beachten Sie , dass das Hinzufügen einer Farbleiste etwas komplizierter sein kann , wenn Sie explizit Abbildungen und Nebenhandlungen verwenden (z. B. fig, ax = plt.subplots()oder ax = fig.add_subplot(111)). Gute Beispiele finden Sie hier für eine einzelne Untergrund-Farbleiste und hier für 2 Unterzeichnungen 1 Farbleiste .

wflynny
quelle
1
Mit dem plt.colorbar()Befehl können Sie eine Legende für die Farben abrufen.
Drevicko
Der Code scheint sich hier geändert zu haben. Cmap = cm.colormap_name sollte jetzt cmap = cm.cmapname sein.
Chris
@ cmarti1138 Ich bin nicht sicher, was du meinst, cm.colormap_nameund cm.cmapnamekeine tatsächlichen Variablen in matplotlib.cm; Es ist nur Pseudocode für cm.jetoder cm.veridis_rusw.
wflynny
Gibt es eine Möglichkeit, die cmapoder cListe einer bereits gezeichneten Kurve zu ändern ?
Guimoute
10

Um die Antwort von wflynny oben zu ergänzen, finden Sie die verfügbaren Farbkarten hier

Beispiel:

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

oder alternativ,

plt.scatter(x, y, c=t, cmap='jet')
Nathan
quelle
3

Unterzeichnung Farbleiste

Bei Nebenplots mit Streuung können Sie einen Farbbalken auf Ihre Achsen übertragen, indem Sie mit Hilfe einer Sekundärfigur das "Mapping" erstellen und es dann Ihrem ursprünglichen Plot hinzufügen.

Als Fortsetzung des obigen Beispiels:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')


# Build your secondary mirror axes:
fig2, (ax3, ax4) = plt.subplots(1, 2)

# Build maps that parallel the color-coded data
# NOTE 1: imshow requires a 2-D array as input
# NOTE 2: You must use the same cmap tag as above for it match
map1 = ax3.imshow(np.stack([t, t]),cmap='viridis')
map2 = ax4.imshow(np.stack([t, t]),cmap='viridis_r')

# Add your maps onto your original figure/axes
fig.colorbar(map1, ax=ax1)
fig.colorbar(map2, ax=ax2)
plt.show()

Nebenhandlungen mit COLORBAR streuen

Beachten Sie, dass Sie auch eine sekundäre Zahl ausgeben, die Sie ignorieren können.

Audelia
quelle