Matplotlib scatterplot; colore in funzione di una terza variabile


152

Voglio creare un diagramma a dispersione (usando matplotlib) in cui i punti sono ombreggiati secondo una terza variabile. Mi sono avvicinato molto a questo:

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

dove w e M sono i punti dati e p è la variabile che voglio sfumare rispetto a.
Tuttavia, voglio farlo in scala di grigi piuttosto che a colori. Qualcuno può aiutare?

Risposte:


156

Non è necessario impostare manualmente i colori. Invece, specifica una mappa dei colori in scala di grigi ...

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

inserisci qui la descrizione dell'immagine

Oppure, se preferisci una gamma più ampia di mappe dei colori , puoi anche specificare il cmapkwarg a scatter. Per utilizzare la versione inversa di uno di questi, basta specificare la " _r" versione di uno di essi. Ad esempio gray_rinvece di gray. Ci sono diverse mappe di colori in scala di grigi differenti pre-fatti (ad esempio gray, gist_yarg, binary, ecc).

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
Grazie! Esiste un modo per tracciare contorni attorno a questi punti contenenti una certa quantità del peso totale?
Thomas Collett,

6
mpl.cmè anche disponibile direttamente come plt.cm.
Heltonbiker,

@Thomas Collet: Se vuoi disegnare contorni, dovresti interpolare i dati dai punti a una matrice 2D, quindi tracciarli usando plt.contour()o plt.contourf()- ma questa è una domanda diversa
Zak,

Come puoi aggiungere l'etichetta nella legenda? In questo caso, con numeri continui, sospetto che useresti la barra dei colori. Che dire di valori discreti? ad esempio, potrei aggiungere 3 etichette nella legenda per le mie tre categorie?
Nate,

26

In matplotlib i colori grigi possono essere indicati come una stringa di un valore numerico compreso tra 0-1.
Per esempioc = '0.1'

Quindi puoi convertire la tua terza variabile in un valore all'interno di questo intervallo e usarla per colorare i tuoi punti.
Nel seguente esempio ho usato la posizione y del punto come valore che determina il colore:

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

inserisci qui la descrizione dell'immagine


3
Per la cronaca, puoi applicare ALPHA come mappa colori se fornisci un array a forma di (n, 4) come cargomento, con valori alfa nella quarta colonna. Se la terza variabile è Z, con shape=(n,1), allora colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))dà un effetto molto bello (ovviamente può essere ottimizzato).
Heltonbiker,

Ottengo un errore: "la lunghezza della sequenza rgba dovrebbe essere 3 o 4"
MattCochrane,

1
@MattClimbs Sospetto che tu stia chiamando plt.plot piuttosto che plt.scatter come nell'esempio.
smashbro,

come si aggiunge una barra dei colori a questa trama?
FaCoffee

2
@FaCoffee plt.colorbar()lo farà
Mathew Savage,

10

A volte potrebbe essere necessario tracciare il colore con precisione in base al caso del valore x . Ad esempio, potresti avere un frame di dati con 3 tipi di variabili e alcuni punti dati. E tu vuoi fare quanto segue,

  • Traccia punti corrispondenti alla variabile fisica 'A' in ROSSO.
  • Traccia punti corrispondenti alla variabile fisica 'B' in BLU.
  • Traccia punti corrispondenti alla variabile fisica 'C' in VERDE.

In questo caso, potrebbe essere necessario scrivere su una funzione breve per mappare i valori x sui nomi dei colori corrispondenti come elenco e quindi passare tale elenco al plt.scattercomando.

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

Colorazione del diagramma a dispersione in funzione della variabile x


come creare una barra dei colori per questa trama?
Maryam Rahmani Moghaddam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.