Contrôler la taille des points dans un nuage de points R?

116

Dans R, la plot()fonction prend un pchargument qui contrôle l'apparence des points dans le tracé. Je crée des nuages ​​de points avec des dizaines de milliers de points et je préfère un petit point, mais pas trop petit. En gros, je trouve que pch='.'c'est trop petit, mais pch=19trop gros. Y a-t-il quelque chose au milieu ou un moyen de réduire les points d'une manière ou d'une autre?

pseudo
la source
Plutôt que de réduire la taille des points, y a-t-il un moyen de simplement tracer, disons que 100 points de données aléatoires seraient plus faciles à voir que 1000?
user2363642
Pour de nombreux petits points, l'utilisation d'alpha (transparence) peut rendre un nuage de points beaucoup plus informatif que d'utiliser simplement moins de points pour le tracer.
1
Je suggère de ne pas utiliser pch='.', ce sera décentré. Source: J'utilisais pch='.'souvent
geneorama
@geneorama Voulez-vous dire utiliser ·au lieu de .?
nanaki
@nanaki plus ou moins, mais curieusement, votre symbole apparaît sous forme de minuscules cases lorsque je l'utilise dans R. Les réponses ci-dessous expliquent bien la bonne approche.
geneorama

Réponses:

100

Essayez l' cexargument:

?par

  • cex
    Une valeur numérique indiquant la quantité d'agrandissement du texte et des symboles par rapport à la valeur par défaut. Notez que certaines fonctions graphiques comme plot.default ont un argument de ce nom qui multiplie ce paramètre graphique, et certaines fonctions comme les points acceptent un vecteur de valeurs qui sont recyclées. D'autres utilisations prendront juste la première valeur si un vecteur de longueur supérieure à un est fourni.
rcs
la source
15
Je ne pense pas que j'utiliserais jamais «cex» pour contrôler la taille des symboles à moins que je n'avais pas d'autre option. Cela ne fonctionne que de temps en temps; la règle est que lorsque «cex» est défini via «par», il affecte la taille de (la plupart) du texte sur le tracé, lorsqu'il est défini dans «plot», «cex» affecte uniquement la taille du symbole. Donc, si vous appliquez mal cette règle, non seulement la taille de votre symbole n'est pas modifiée, mais vous avez maintenant plusieurs paramètres affectant la taille du texte (cex.axis, cex.lab, cex.main et cex.sub - tous font la même chose travail comme «cex», seulement par morceaux). Un code comme celui-là est difficile à maintenir et à étendre.
doug
5
Se mettre d'accord. La définition cexglobale via parmodifie toutes sortes de choses, y compris les marges des figures, que vous devez corriger. la mise cexen place plot, cependant, semble fonctionner.
vole le
Le conseil exprimé ci-dessus par le commentaire de doug n'est pas nécessairement faux, mais il surestime considérablement les problèmes potentiels liés à l'utilisation de l' cexargument lors du traçage. Il existe de très nombreux cas où c'est à la fois utile et la meilleure option.
joran
lwdcontrôle la largeur de ligne du pch, par exemple plot(1:5, pch=1:5, col=1:5, lwd=1:5). Merci à sthda.com/english/wiki/…
geneorama
95

pch = 20 renvoie un symbole dont la taille est comprise entre "." et 19.

C'est un symbole rempli (ce que vous voulez probablement).

En dehors de cela, même le système graphique de base de R permet à un utilisateur un contrôle précis sur la taille, la couleur et la forme des symboles. Par exemple,

dfx = data.frame(ev1=1:10, ev2=sample(10:99, 10), ev3=10:1)

with(dfx, symbols(x=ev1, y=ev2, circles=ev3, inches=1/3,
                  ann=F, bg="steelblue2", fg=NULL))

Exemple de graphique

doug
la source
J'adore cette intrigue, mais j'aimerais que le rayon soit égal au nombre d'observations sur ce point, pouvez-vous me montrer comment faire cela?
Derk Arts
pi*R^2(la surface) doit être proportionnelle au nombre d'observations.
SESman
5
@saratis Cela fera ce que vous voulez:symbols(x=dfx$ev1, y=dfx$ev2, circles=sqrt(dfx$ev3/pi), inches=1/3, ann=F, bg="steelblue2", fg=NULL)
fmark
1
une idée sur la façon dont je pourrais utiliser cela pour tracer plusieurs séries sur le même graphique? ie "points (x = dfx2 $ ev1, y = dfx2 $ ev2, cercles = dfx2 $ ev3, ...)" ne fonctionne pas.
Neodyme
Au cas où vous vous demanderiez "Qu'est-ce qu'un pouce?" voir ici
MichaelChirico
22

Comme indiqué par rcs , cexfera le travail dans le package graphique de base. Je pense que vous n'êtes pas prêt à faire votre graphique, ggplot2mais si vous le faites, il y a un sizeattribut esthétique, que vous pouvez facilement contrôler ( ggplot2a des arguments de fonction conviviaux: au lieu de taper cex(expansion de caractères), ggplot2vous pouvez taper par exemple size = 2et vous obtiendrez un point de 2 mm).

Voici l'exemple:

### base graphics ###
plot(mpg ~ hp, data = mtcars, pch = 16, cex = .9)

### ggplot2 ###
# with qplot()
qplot(mpg, hp, data = mtcars, size = I(2))
# or with ggplot() + geom_point()
ggplot(mtcars, aes(mpg, hp), size = 2) + geom_point()
# or another solution:
ggplot(mtcars, aes(mpg, hp)) + geom_point(size = 2)
aL3xa
la source
4
Et, si vous tracez vraiment des dizaines de milliers de points, ggplot2 a plusieurs façons de rendre cela agréable - ajustements alpha, cases hexadécimales, tracés de contour, etc. Consultez les pages 72-77 du livre ggplot2, s'il y en a un dans votre bibliothèque ou si votre bibliothèque a un accès électronique aux livres Springer (je pense que la plupart des livres R y sont).
Matt Parker
Ouais ... Je l'utilise surtout alphadans les nuages ​​de points, pour éviter les surplots.
aL3xa
@ aL3xa Vous pouvez utiliser alpha dans le package graphique de base. Ajoutez simplement par exemple col = rgb(0, 0, 0, 0.6)dans les options de tracé.
RobJan