118 votes

Diagramme de dispersion et cartographie des couleurs en Python

J'ai une gamme 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 diagramme de dispersion en utilisant

import matplotlib.pyplot as plt

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

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

Quel est le moyen le plus simple de le faire ?

217voto

wflynny Points 11141

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'indice, t qui est juste un tableau de [1, 2, ..., 100] . enter image description here

Un exemple plus facile à comprendre est peut-être celui, légèrement plus simple, de

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

enter image description here

Notez que le tableau que vous passez comme c n'a pas besoin d'avoir un ordre ou un type particulier, c'est-à-dire qu'il n'a pas besoin d'être trié ou d'être des entiers comme dans ces exemples. La routine de traçage mettra à l'échelle la carte de couleurs de façon à ce que les valeurs minimales/maximales dans le tableau de bord soient les mêmes. c correspondent au bas et au haut de la carte des couleurs.

Colormaps

Vous pouvez modifier la carte des couleurs en ajoutant

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

Importation de matplotlib.cm est facultatif, car vous pouvez appeler les cartes de couleurs en tant que cmap="cmap_name" tout aussi bien. Il existe un page de référence de cartes de couleurs montrant à quoi elles ressemblent. Sachez également que vous pouvez inverser une carte de couleurs en l'appelant simplement en tant que cmap_name_r . Donc, soit

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

fonctionnera. Voici quelques exemples "jet_r" o cm.plasma_r . Voici un exemple avec la nouvelle carte de couleurs viridis 1.5 :

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

enter image description here

Barres de couleur

Vous pouvez ajouter une barre de couleur en utilisant

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

enter image description here

Notez que si vous utilisez des figures et des sous-points de manière explicite (par ex. fig, ax = plt.subplots() o ax = fig.add_subplot(111) ), l'ajout d'une barre de couleur peut être un peu plus compliqué. De bons exemples peuvent être trouvés ici pour une seule barre de couleur de sous-plot y ici pour 2 sous-plots 1 colorbar .

14voto

Nathan Points 301

Pour compléter la réponse de wflynny ci-dessus, vous pouvez trouver les cartes de couleurs disponibles. aquí

Exemple :

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

ou alternativement,

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

6voto

Audelia Points 61

Barre de couleur de la sous-partie

Pour les sous-plots avec dispersion, vous pouvez insérer une barre de couleur sur vos axes en construisant le "mappable" à l'aide d'une figure secondaire, puis en l'ajoutant à votre tracé original.

Dans la continuité 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 subplots with COLORBAR

Notez que vous obtiendrez également un chiffre secondaire que vous pouvez ignorer.

2voto

Obi Points 1

Une seule barre de couleur pour plusieurs sous-plages

Il est parfois préférable d'avoir une seule barre de couleur pour indiquer les valeurs des données visualisées sur plusieurs sous-plans.

Dans ce cas, un objet Normalize() doit être créé en utilisant les valeurs minimales et maximales des données des deux graphiques.

Ensuite, un objet colorbar peut être créé à partir d'un objet ScalarMappable(), qui établit une correspondance entre les valeurs scalaires et les couleurs.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = x
t1 = x # Colour data for first plot
t2 = 2*x # Color data for second plot
all_data = np.concatenate([t1, t2])

# Create custom Normalise object using the man and max data values across both subplots to ensure colors are consistent on both plots
norm = plt.Normalize(np.min(all_data), np.max(all_data))

fig, axs = plt.subplots(1, 2)
axs[0].scatter(x, y, c=t1, cmap='viridis', norm=norm)
axs[1].scatter(x**2, y, c=t2, cmap='viridis', norm=norm)

# Create the colorbar
smap = plt.cm.ScalarMappable(cmap='viridis', norm=norm)
cbar = fig.colorbar(smap, ax=axs, fraction=0.1, shrink = 0.8)
cbar.ax.tick_params(labelsize=11)
cbar.ax.set_ylabel('T', rotation=0, labelpad = 15, fontdict = {"size":14})
plt.show()

sous-points_barre de couleur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X