matplotlib nuage de points Couleur en fonction de la troisième variable

je voudrais savoir comment rendre la fonction de dispersion de matplotlib des points de couleur par une troisième variable.

Questions gnuplot linecolor variable in matplotlib? et matplotlib scatterplot; couleur en fonction d'une troisième variable posé des questions similaires, cependant, les réponses à ces questions ne répondent pas à mon problème: l'utilisation de c=arraywhichspecifiespointcolour dans la fonction de dispersion ne définit la couleur de remplissage, pas la couleur de bord. Cela signifie que l'utilisation de c=arr... échoue lors de l'utilisation de markersymbol='+' , par exemple (parce que ce marqueur n'a pas de remplissage, seulement des arêtes). Je veux que les points soient colorés par une troisième variable fiable, quel que soit le symbole utilisé.

y a-t-il un moyen d'y parvenir avec la fonction scatter de Matplotlib?

24
demandé sur Community 2012-10-19 03:05:31

1 réponses

cela fonctionne pour moi, en utilisant matplotlib 1.1:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = np.sin(x)

plt.scatter(x, y, marker='+', s=150, linewidths=4, c=y, cmap=plt.cm.coolwarm)
plt.show()

résultat:

enter image description here

alternativement, pour les points n, faites un tableau des valeurs de couleur RGB avec la forme (n, 3), et assignez-le au edgecolors argument de mot-clé de scatter() :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 100)
y = np.sin(x)
z = x + 20 * y

scaled_z = (z - z.min()) / z.ptp()
colors = plt.cm.coolwarm(scaled_z)

plt.scatter(x, y, marker='+', edgecolors=colors, s=150, linewidths=4)
plt.show()

résultat: enter image description here

cet exemple obtient les valeurs RGBA z à la gamme [0,1], et appelant le colormap plt.cm.coolwarm avec les valeurs graduées. Lorsqu'il est appelé de cette façon, un colormap matplotlib retourne un tableau de valeurs RGBA, chaque ligne donnant la couleur de la valeur d'entrée correspondante. Par exemple:

>>> t = np.linspace(0, 1, 5)
>>> t
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])
>>> plt.cm.coolwarm(t) 
array([[ 0.2298,  0.2987,  0.7537,  1.    ],
       [ 0.5543,  0.6901,  0.9955,  1.    ],
       [ 0.8674,  0.8644,  0.8626,  1.    ],
       [ 0.9567,  0.598 ,  0.4773,  1.    ],
       [ 0.7057,  0.0156,  0.1502,  1.    ]])
29
répondu Warren Weckesser 2013-03-22 12:07:30