web-dev-qa-db-fra.com

couleur du diagramme de dispersion matplotlib en fonction de la troisième variable

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

Les questions variable gnuplot linecolor dans matplotlib? et Matplotlib scatterplot; couleur en fonction d'une troisième variable ont posé des questions similaires, cependant, les réponses à ces questions ne résolvent pas mon problème : l'utilisation de c=arraywhichspecifiespointcolour dans la fonction scatter définit uniquement la couleur de remplissage, pas la couleur du 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 bords). Je veux que les points soient colorés par une troisième variable de manière fiable, quel que soit le symbole utilisé.

Existe-t-il un moyen d'y parvenir avec la fonction de diffusion de Matplotlib?

26
user1082930

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 n points, créez un tableau de valeurs de couleur RVB avec la forme (n, 3) et affectez-le à l'argument de mot clé edgecolors 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 en mettant à l'échelle les valeurs z dans la plage [0,1] et en appelant la palette de couleurs plt.cm.coolwarm Avec les valeurs mises à l'échelle. Lorsqu'elle est appelée de cette façon, une palette de couleurs matplotlib renvoie 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
Warren Weckesser