Grafico a dispersione e mappatura dei colori in Python


91

Ho una serie di punti xey memorizzati in array numpy. Quelli rappresentano x (t) e y (t) dove t = 0 ... T-1

Sto tracciando un grafico a dispersione usando

import matplotlib.pyplot as plt

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

Vorrei avere una mappa dei colori che rappresenti il ​​tempo (quindi colorando i punti a seconda dell'indice negli array numpy)

Qual è il modo più semplice per farlo?

Risposte:


170

Ecco un esempio

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

Qui stai impostando il colore in base all'indice t, che è solo un array di [1, 2, ..., 100]. inserisci qui la descrizione dell'immagine

Forse un esempio più facile da capire è quello leggermente più semplice

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

inserisci qui la descrizione dell'immagine

Nota che l'array passato come cnon ha bisogno di avere un ordine o tipo particolare, cioè non ha bisogno di essere ordinato o numeri interi come in questi esempi. La routine di stampa ridimensionerà la mappa di colori in modo che i valori minimo / massimo ccorrispondano al fondo / all'inizio della mappa di colori.

Colormaps

Puoi cambiare la mappa dei colori aggiungendo

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

L'importazione matplotlib.cmè facoltativa in quanto puoi chiamare anche le mappe dei colori cmap="cmap_name". C'è una pagina di riferimento delle mappe dei colori che mostra l'aspetto di ciascuna. Sappi anche che puoi invertire una mappa di colori chiamandola semplicemente come cmap_name_r. Quindi neanche

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

funzionerà. Gli esempi sono "jet_r"o cm.plasma_r. Ecco un esempio con la nuova 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()

inserisci qui la descrizione dell'immagine

Colorbars

Puoi aggiungere una barra dei colori usando

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

inserisci qui la descrizione dell'immagine

Nota che se stai usando figure e sottotrame esplicitamente (ad esempio fig, ax = plt.subplots()o ax = fig.add_subplot(111)), l'aggiunta di una barra dei colori può essere un po 'più complicata. Buoni esempi possono essere trovati qui per una singola barra dei colori della sottotrama e qui per 2 sottotrame 1 barra dei colori .


1
Puoi ottenere una legenda per i colori con il plt.colorbar()comando.
drevicko

Il codice sembra essere cambiato qui. Cmap = cm.colormap_name ora dovrebbe essere cmap = cm.cmapname.
Chris

@ cmarti1138 Non sono sicuro di cosa intendi, cm.colormap_namee cm.cmapnamenon le variabili effettive in matplotlib.cm; è solo uno pseudocodice per cm.jetor cm.veridis_r, ecc.
wflynny

C'è un modo per modificare l' elenco cmapo cdi una curva già tracciata?
Guimoute

10

Per aggiungere alla risposta di wflynny sopra, puoi trovare le mappe dei colori disponibili qui

Esempio:

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

o in alternativa,

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

3

Barra colori sottotrama

Per le sottotrame con dispersione, puoi ingannare una barra dei colori sui tuoi assi costruendo il "mappabile" con l'aiuto di una figura secondaria e quindi aggiungendolo alla trama originale.

Come continuazione dell'esempio precedente:

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

Scatter sottotrame con COLORBAR

Notare che si produrrà anche una cifra secondaria che è possibile ignorare.

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.