web-dev-qa-db-fra.com

les petits marqueurs de dispersion dans 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 de la bonne couleur (elle est toujours noire).

Je peux obtenir exactement ce que je veux en utilisant gnuplot: tracez des 'nœuds' avec les points pt 0 lc rgb 'grey'

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

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

Ceci définit la taille du marqueur sur 1 (s = 1), la couleur de la façade sur gris (couleur de la façade = '0.5') et la largeur de ligne sur 0 (lw = 0).

69
Daan

Si le marqueur n'a pas de visage (ne peut pas être rempli, par exemple '+', 'x'), la variable edgecolor doit être définie à la place 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é.

30
cyborg

La réponse la plus simple et absolue à votre question est la suivante: utilisez le paramètre 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 en comparant 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 souhaitez simplement que votre marqueur soit de la même nuance de gris, vous ne devriez vraiment pas avoir à vous soucier de choses comme la couleur du visage par rapport à la couleur de l'Edge, et si votre marqueur est défini comme toutes les arêtes ou certaines arêtes et certaines zones de remplissage. À la place, utilisez simplement le paramètre color et sachez que votre marqueur entier sera défini sur la couleur unique que vous spécifiez!

3
qg_jinn

En réponse à la question de zwol en commentaire - ma réputation n'est pas assez élevée pour laisser des commentaires, il faudra donc que: vous pouvez utiliser color = comme illustré ci-après:

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