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.