Matplotlib-Streudiagramm; Farbe als Funktion einer dritten Variablen

152

Ich möchte ein Streudiagramm (mit matplotlib) erstellen, in dem die Punkte gemäß einer dritten Variablen schattiert sind. Ich bin sehr nah dran:

plt.scatter(w, M, c=p, marker='s')

Dabei sind w und M die Datenpunkte und p die Variable, auf die ich schattieren möchte.
Ich möchte es jedoch eher in Graustufen als in Farbe tun. Kann jemand helfen?

Thomas Collett
quelle

Antworten:

156

Die Farben müssen nicht manuell eingestellt werden. Geben Sie stattdessen eine Graustufen-Farbkarte an ...

import numpy as np
import matplotlib.pyplot as plt

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

# Plot...
plt.scatter(x, y, c=y, s=500)
plt.gray()

plt.show()

Geben Sie hier die Bildbeschreibung ein

Wenn Sie eine größere Auswahl an Farbkarten bevorzugen , können Sie auch das cmapkwarg angeben scatter. Um die umgekehrte Version einer dieser Versionen zu verwenden, geben Sie einfach die " _r" Version einer dieser Versionen an. ZB gray_rstatt gray. Es gibt verschiedene Graustufen - Farbtabellen Vorgefertigte (zB gray, gist_yarg, binaryusw.).

import matplotlib.pyplot as plt
import numpy as np

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

plt.scatter(x, y, c=y, s=500, cmap='gray')
plt.show()
Joe Kington
quelle
1
Vielen Dank! Gibt es überhaupt Konturen um diese Punkte zu zeichnen, die einen bestimmten Betrag des Gesamtgewichts enthalten?
Thomas Collett
6
mpl.cmist auch direkt als erhältlich plt.cm.
Heltonbiker
@ Thomas Collet: Wenn Sie Konturen zeichnen möchten, müssen Sie die Daten aus den Punkten in eine 2D-Matrix interpolieren und diese dann mit plt.contour()oder plt.contourf()- aber das ist eine andere Frage
Zak
Wie können Sie das Etikett in die Legende einfügen? In diesem Fall mit fortlaufenden Zahlen würden Sie vermutlich die Farbleiste verwenden. Was ist mit diskreten Werten? Könnte ich beispielsweise der Legende 3 Bezeichnungen für meine drei Kategorien hinzufügen?
Nate
26

In matplotlib können graue Farben als Zeichenfolge mit einem numerischen Wert zwischen 0-1 angegeben werden.
Beispielsweisec = '0.1'

Anschließend können Sie Ihre dritte Variable in einen Wert innerhalb dieses Bereichs konvertieren und zum Färben Ihrer Punkte verwenden.
Im folgenden Beispiel habe ich die y-Position des Punkts als Wert verwendet, der die Farbe bestimmt:

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [125, 32, 54, 253, 67, 87, 233, 56, 67]

color = [str(item/255.) for item in y]

plt.scatter(x, y, s=500, c=color)

plt.show()

Geben Sie hier die Bildbeschreibung ein

Joaquin
quelle
2
Für den Datensatz können Sie ALPHA als Farbkarte anwenden, wenn Sie ein (n, 4) -förmiges Array als cArgument mit Alpha-Werten in der vierten Spalte angeben . Wenn die dritte Variable Z ist shape=(n,1), colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))ergibt sich ein sehr schöner Effekt (natürlich kann sie optimiert werden).
Heltonbiker
Ich erhalte eine Fehlermeldung: 'Länge der RGBA-Sequenz sollte entweder 3 oder 4 sein'
MattCochrane
1
@MattClimbs Ich vermute, Sie rufen plt.plot auf und nicht plt.scatter wie im Beispiel.
Smashbro
Wie fügt man diesem Plot eine Farbleiste hinzu?
FaCoffee
1
@FaCoffee plt.colorbar()wird das tun
Mathew Savage
10

Manchmal müssen Sie die Farbe möglicherweise genau basierend auf dem x-Wert-Fall zeichnen . Beispielsweise können Sie einen Datenrahmen mit drei Variablentypen und einigen Datenpunkten haben. Und du willst folgendes tun,

  • Zeichnen Sie Punkte, die der physikalischen Variablen 'A' in ROT entsprechen.
  • Zeichnen Sie Punkte, die der physikalischen Variablen 'B' in BLAU entsprechen.
  • Zeichnen Sie Punkte, die der physikalischen Variablen 'C' in GRÜN entsprechen.

In diesem Fall müssen Sie möglicherweise in die Kurzfunktion schreiben, um die x-Werte den entsprechenden Farbnamen als Liste zuzuordnen und diese Liste dann an den plt.scatterBefehl weiterzuleiten .

x=['A','B','B','C','A','B']
y=[15,30,25,18,22,13]

# Function to map the colors as a list from the input list of x variables
def pltcolor(lst):
    cols=[]
    for l in lst:
        if l=='A':
            cols.append('red')
        elif l=='B':
            cols.append('blue')
        else:
            cols.append('green')
    return cols
# Create the colors list using the function above
cols=pltcolor(x)

plt.scatter(x=x,y=y,s=500,c=cols) #Pass on the list created by the function here
plt.grid(True)
plt.show()

Farbstreudiagramm als Funktion der Variablen x

Tirtha
quelle
Wie erstelle ich einen Farbbalken für dieses Diagramm?
Maryam Rahmani Moghaddam