2010-07-01 14 views
4

J'ai une intrigue avec beaucoup de points qui se chevauchent (va de 2-10). L'ajout de gigue aux points le rend très bruyant et peu attrayant. J'aime ajouter un alpha dans l'esthétique. Cependant, j'aimerais avoir une légende dans laquelle un lecteur peut voir combien de points se chevauchent pour chacune de ces transparences. Y a-t-il un tel moyen?Existe-t-il un moyen d'ajouter une légende pour l'alpha de ggplot?

ggplot(data=mydata,aes(x=x,y=y)) + geom_point(size=3,shape=2,aes(alpha=1/3)) 

Supposons que j'utilise le code ci-dessus. Comment pourrais-je incorporer une légende pour l'alpha?

+0

Cela ne répond pas à votre question, mais peut-être juste un peu de gigue avec transparence pourrait ne pas être trop bruyant, mais indiquer toujours le nombre de points. – Aniko

+0

Vous pouvez obtenir les données dans GGobi, et utiliser l'outil Pinceau sur la zone où survient la surimpression, donc exporter la description de l'affichage et jouer avec lui dans R avec les paquets 'rggobi' et' DescribeDisplay'. Ou vice versa. – aL3xa

Répondre

0

Pas exactement ce que vous voulez, mais qu'en est-il de geom_hex()? Si vous ne discrétisez pas (bin), je pense que R aurait besoin de calculer la superposition et le nombre de chevauchements (ce qui dépendrait aussi de la taille du point), et cela semble dur.

library(hexbin) 

mydata <- data.frame(x = rnorm(100), y = rnorm(100)) 
ggplot(data=mydata,aes(x=x,y=y)) + geom_hex() 
+0

Merci beaucoup. C'est presque exactement ce que je veux. Si seulement je pouvais transformer les hexagones en cercles ... – Maiasaura

+1

Bonne chance pour obtenir des cercles pour carreler un avion;) – hadley

+1

ha! Je suppose que la meilleure chose à faire est d'utiliser geom_point mais de créer une autre colonne de compte et de la définir comme taille. – Maiasaura

1

Voici un exemple de fausses informations. Essayez-le plusieurs fois en variant alpha.

require(ggplot2) 

n = 10000 
alpha = 0.01 

set.seed(12345) 
data = data.frame(replicate(2, rnorm(n))) 

dev.new(width=4, height=3) 
p = qplot(X1, X2, data=data, alpha=alpha) 

fake_scale = scale_alpha('# of overlapping pts', breaks=pretty(c(alpha, 1)), labels=as.character(pretty(c(alpha, 1))/alpha)) 

p + fake_scale 

alpha = 0.1

enter image description here

alpha = 0.01

enter image description here

+0

Cela ne fonctionne pas pour moi pour une raison quelconque (les points dans la légende sont tous les mêmes ténèbres). Utilisez-vous la version développeur de 'ggplot2'? – joran

+0

Salut joran - Je ne pense pas. J'utilise ggplot2_0.8.8, plyr_1.4, et R version 2.11.1 sous i386-apple-darwin9.8.0. Les parcelles sont imprimées à l'aide du dispositif à quartz. –

+0

Ah, d'accord. Eh bien, il ne semble pas fonctionner sur OS X avec R 2.13.1 et ggplot2_0.8.9. FYI. – joran

0

Se inspirant d'autres réponses, il semble que vous pouvez bin points xy en valeurs uniques, puis résumer le nombre de valeurs uniques pour chaque corbeille de coordonnées xy.

En utilisant les données fausses d'une autre réponse,

library(ggplot2) 
library(dplyr) 
library(magrittr) 

n = 10000 

set.seed(12345) 
data = data.frame(replicate(2, rnorm(n))) 

Je binning par la 1ère place décimale, puis compter combien sont dans chaque bac

data2 <- data %>% mutate(
    x = round(X1,1), 
    y = round(X2,1) 
) %>% 
    group_by(x,y) %>% 
    tally() %>% 
    dplyr::filter(n<=10) %>% 
    mutate(transp = n/10) 

Je filtré le plus grand poubelles juste à des fins d'illustration. Maintenant, la colonne transp a le calcul que vous voulez, que vous pouvez fournir à alpha et obtenir dans la légende

data2 %>% 
    ggplot(aes(x=x,y=y)) + 
    geom_point(aes(alpha = as.factor(transp))) + 
    scale_alpha_discrete(
    "Number of overlapping points", 
    labels = 1:10 
)+ 
    theme(legend.position = "bottom") 

pic:

enter image description here