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.