les petits marqueurs de dispersion dans le matplotlib sont toujours noirs

J’essaie d’utiliser matplotlib pour créer un nuage de points avec de très petits points gris. En raison de la densité de points, les points doivent être petits. Le problème est que les marqueurs de la fonction scatter () semblent avoir à la fois une ligne et un remplissage. Lorsque les marqueurs sont petits, seule la ligne est visible, pas le remplissage, et la ligne n’est pas la bonne couleur (elle est toujours noire).

Je peux obtenir exactement ce que je veux en utilisant gnuplot: tracez ‘nodes’ avec les points pt 0 lc rgb ‘grey’

Comment puis-je créer de très petits points gris en utilisant le diagramme de dispersion matplotlib ()?

scatter([1,2,3], [2,4,5], s=1, facecolor='0.5', lw = 0) 

Ceci définit le marqueur à 1 (s = 1), le facecolor à gris (facecolor = ‘0.5’) et le linewidth à 0 (lw = 0).

Si le marqueur n’a pas de visage (ne peut pas être rempli, par exemple '+' , 'x' ), alors edgecolor doit être défini au lieu de c , et lw ne doit pas être 0 :

 scatter([1,2,3], [2,4,5], marker='+', edgecolor='r') 

Ce qui suit ne fonctionnera pas

 scatter([1,2,3], [2,4,5], s=1, marker='+', facecolor='0.5', lw = 0) 

parce que le bord / la ligne ne sera pas affiché, donc rien ne sera affiché.

La réponse la plus simple à votre question est la suivante: utilisez le paramètre de color au lieu du paramètre c pour définir la couleur de l’ensemble du marqueur.

Il est facile de voir la différence lorsque vous comparez les résultats:

 from matplotlib import pyplot as plt plt.scatter([1,2,3], [3,1,2], c='0.8') # marker not all gray plt.scatter([1,2,3], [3,1,2], color='0.8') # marker all gray 

Détails: Pour votre cas d’utilisation simple où vous voulez simplement que votre marqueur entier ait la même nuance de gris, vous ne devriez vraiment pas avoir à vous soucier de la couleur du visage ou de la couleur des bords, et de la définition ou quelques bords et certains remplissent. Au lieu de cela, utilisez simplement le paramètre de color et sachez que votre marqueur entier sera défini sur la couleur unique que vous spécifiez!

En réponse à la question de zwol dans le commentaire – ma réputation n’est pas assez élevée pour laisser des commentaires, donc cela devra faire: dans le cas où vos couleurs proviennent d’une palette de couleurs (c’est-à-dire d’une “séquence de valeurs à mapper”) vous pouvez utiliser color = comme démontré ci-dessous:

 from matplotlib import pyplot x = [1,5,8,9,5] y = [4,2,4,7,9] numSides = [2,3,1,1,5] cmap = pyplot.cm.get_cmap("copper_r") min, max = min(numSides), max(numSides) for i in range(len(x)): if numSides[i] >= 2: cax = pyplot.scatter(x[i], y[i], marker = '+', s = 100, c = numSides[i], cmap = cmap) cax.set_clim(min, max) elif numSides[i] == 1: pyplot.scatter(x[i], y[i], marker = '.', s = 40, color = cmap(numSides[i])) fig = pyplot.gcf() fig.set_size_inches(8.4, 6) fig.savefig('figure_test.png', dpi = 200) pyplot.show()