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?

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()

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


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


Wie erstelle ich einen Farbbalken für dieses Diagramm?
Maryam Rahmani Moghaddam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.