Nuage de points et mappage des couleurs en Python


91

J'ai une plage de points x et y stockés dans des tableaux numpy. Ceux-ci représentent x (t) et y (t) où t = 0 ... T-1

Je trace un nuage de points en utilisant

import matplotlib.pyplot as plt

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

Je voudrais avoir une palette de couleurs représentant le temps (donc colorer les points en fonction de l'index dans les tableaux numpy)

Quelle est la manière la plus simple de le faire?

Réponses:


170

Voici un exemple

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

Ici, vous définissez la couleur en fonction de l'index t, qui n'est qu'un tableau de [1, 2, ..., 100]. entrez la description de l'image ici

Un exemple peut-être plus facile à comprendre est le plus simple

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

entrez la description de l'image ici

Notez que le tableau que vous passez en tant que cn'a pas besoin d'avoir un ordre ou un type particulier, c'est-à-dire qu'il n'a pas besoin d'être trié ou des entiers comme dans ces exemples. La routine de traçage mettra à l'échelle la palette de couleurs de telle sorte que les valeurs minimum / maximum dans ccorrespondent au bas / haut de la palette de couleurs.

Couleurs

Vous pouvez modifier la palette de couleurs en ajoutant

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

L'importation matplotlib.cmest facultative car vous pouvez également appeler des couleurs cmap="cmap_name". Il y a une page de référence de couleurs montrant à quoi chacun ressemble. Sachez également que vous pouvez inverser une palette de couleurs en l'appelant simplement cmap_name_r. Alors non plus

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

marchera. Des exemples sont "jet_r"ou cm.plasma_r. Voici un exemple avec la nouvelle 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()

entrez la description de l'image ici

Barres de couleurs

Vous pouvez ajouter une barre de couleurs en utilisant

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

entrez la description de l'image ici

Notez que si vous utilisez explicitement des figures et des sous-graphiques (par exemple fig, ax = plt.subplots()ou ax = fig.add_subplot(111)), l'ajout d'une barre de couleurs peut être un peu plus compliqué. De bons exemples peuvent être trouvés ici pour une seule barre de couleur de sous-tracé et ici pour 2 sous-graphiques, 1 barre de couleur .


1
Vous pouvez obtenir une légende pour les couleurs avec la plt.colorbar()commande.
drevicko

Le code semble avoir changé ici.cmap = cm.colormap_name devrait maintenant être cmap = cm.cmapname.
Chris

@ cmarti1138 Je ne suis pas sûr de ce que vous voulez dire, cm.colormap_nameet cm.cmapnamenon des variables réelles matplotlib.cm; c'est juste un pseudocm.jetcm.veridis_r
code

Existe-t-il un moyen de modifier la cmapou la cliste d'une courbe déjà tracée?
Guimoute

10

Pour ajouter à la réponse de wflynny ci-dessus, vous pouvez trouver les couleurs disponibles ici

Exemple:

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

Ou bien,

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

3

Barre de couleurs de sous-tracé

Pour les sous-graphiques avec dispersion, vous pouvez tromper une barre de couleurs sur vos axes en construisant le «mappable» à l'aide d'une figure secondaire, puis en l'ajoutant à votre graphique d'origine.

Dans le prolongement de l'exemple ci-dessus:

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 sous-graphes avec COLORBAR

Notez que vous allez également générer une figure secondaire que vous pouvez ignorer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.