Parce que d'autres réponses ici prétendent que s
désigne la zone du marqueur, j'ajoute cette réponse pour préciser que ce n'est pas nécessairement le cas.
Taille en points^2
L'argument s
sur plt.scatter
désigne le markersize**2
. Comme le dit la documentation
s
: scalaire ou tableau, forme (n, ), facultatif
la taille en points^2. La valeur par défaut est rcParams['lines.markersize'] ** 2.
Cela peut être pris au pied de la lettre. Pour obtenir un marqueur de x points, il faut élever ce nombre au carré et le donner au s
argument.
Ainsi, la relation entre la taille du marqueur d'un graphique linéaire et l'argument de la taille du nuage de points est le carré. Pour produire un marqueur de dispersion de la même taille qu'un marqueur de tracé de taille 10 points, il faut donc appeler scatter( .., s=100)
.
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot([0],[0], marker="o", markersize=10)
ax.plot([0.07,0.93],[0,0], linewidth=10)
ax.scatter([1],[0], s=100)
ax.plot([0],[1], marker="o", markersize=22)
ax.plot([0.14,0.86],[1,1], linewidth=22)
ax.scatter([1],[1], s=22**2)
plt.show()
Raccordement à la "zone
Alors pourquoi les autres réponses et même la documentation parlent de "zone" lorsqu'il s'agit de la s
paramètre ?
Bien sûr, les unités des points**2 sont des unités de surface.
- Pour le cas particulier d'un marqueur carré,
marker="s"
l'aire du marqueur est en effet directement la valeur de la variable s
paramètre.
- Pour un cercle, l'aire du cercle est de
area = pi/4*s
.
- Pour d'autres marqueurs, il peut même ne pas y avoir de relation évidente avec la zone du marqueur.
Dans tous les cas, cependant, la surface du marqueur est proportionnelle à la taille de l'échantillon. s
paramètre . C'est la raison pour laquelle on l'appelle "zone", même si dans la plupart des cas, elle ne l'est pas vraiment.
Spécifier la taille des marqueurs de diffusion en termes d'une quantité proportionnelle à la surface du marqueur est donc logique dans la mesure où c'est la surface du marqueur qui est perçue lors de la comparaison de différents patchs plutôt que sa longueur ou son diamètre. En d'autres termes, le fait de doubler la quantité sous-jacente devrait doubler la surface du marqueur.
Que sont les points ?
Jusqu'à présent, la réponse à la question de savoir ce que signifie la taille d'un marqueur de dispersion est donnée en unités de points. Les points sont souvent utilisés en typographie, où les polices de caractères sont spécifiées en points. De même, la largeur des lignes est souvent spécifiée en points. La taille standard des points dans matplotlib est de 72 points par pouce (ppi) - 1 point correspond donc à 1/72 pouces.
Il pourrait être utile de pouvoir spécifier les tailles en pixels plutôt qu'en points. Si le dpi de la figure est également de 72, un point correspond à un pixel. Si le dpi de la figure est différent (le défaut de matplotlib est fig.dpi=100
),
1 point == fig.dpi/72. pixels
Alors que la taille en points du marqueur de diffusion serait donc différente pour différentes dpi de chiffres, on pourrait produire un marqueur de 10 par 10 pixels^2, qui aurait toujours le même nombre de pixels couverts :
import matplotlib.pyplot as plt
for dpi in [72,100,144]:
fig,ax = plt.subplots(figsize=(1.5,2), dpi=dpi)
ax.set_title("fig.dpi={}".format(dpi))
ax.set_ylim(-3,3)
ax.set_xlim(-2,2)
ax.scatter([0],[1], s=10**2,
marker="s", linewidth=0, label="100 points^2")
ax.scatter([1],[1], s=(10*72./fig.dpi)**2,
marker="s", linewidth=0, label="100 pixels^2")
ax.legend(loc=8,framealpha=1, fontsize=8)
fig.savefig("fig{}.png".format(dpi), bbox_inches="tight")
plt.show()
Si vous êtes intéressé par une dispersion dans les unités de données, vérifiez les points suivants cette réponse .
1 votes
Je suis presque sûr que les points sont les mêmes unités que celles utilisées pour les polices de caractères.
2 votes
@tcaswell, vous voulez dire
s=20
signifie que la taille du marqueur est égale à celle d'unfontsize=20
lettre ?0 votes
Non, l'aire sera de 20 points^2, a
fontsize=20
La lettre fait 20 points de haut (ou le caractère de référence de la police fait 20 points de haut).42 votes
matplotlib.pyplot.plot()
tienems
paramètre (markersize
) un équivalent pourmatplotlib.pyplot.scatter()
paramètres
(size
). Juste un rappel..1 votes
@neikas il me semble qu'ils ne le sont pas, puisque l'un est en pixels (markersize) et l'autre est dans cette unité bizarre de points carrés (size). Cela m'a toujours dérouté, mais je crois que c'est lié au fait que la taille du marqueur du nuage de points est utilisée pour indiquer la quantité d'une manière visuellement proportionnelle.
2 votes
@heltonbiker a raison sur ce point. Si vous voulez faire correspondre le
markersize
de laplot
à la fonctions
de lascatter
vous devez la mettre au carré, c'est-à-dire ques = markersize**2
.