2015-12-03 12 views
5

Próbując odpowiedzieć this question, jeden sposób, aby stworzyć pożądany działki było wykorzystanie geom_dotplot z ggplot2 następująco:Ręczne tworzenie legendy, kiedy nie może dostarczyć estetyczny kolor

library(ggplot2) 
library(reshape2) 

CTscores <- read.csv(text="initials,total,interest,slides,presentation 
CU,1.6,1.7,1.5,1.6 
DS,1.6,1.7,1.5,1.7 
VA,1.7,1.5,1.5,2.1 
MB,2.3,2.0,2.1,2.9 
HS,1.2,1.3,1.4,1.0 
LS,1.8,1.8,1.5,2.0") 

CTscores.m = melt(CTscores, id.var="initials") 

ggplot(CTscores.m, aes(x=variable, y=value)) + 
    geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03) + 
    theme_bw()+coord_flip() 

enter image description here

Aby odróżnić punkty, wygodnie byłoby po prostu dodać kolor, ale dławiki w kolorze i nie kończą się układaniem:

ggplot(CTscores.m, aes(x=variable, y=value, fill=initials)) + 
    geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03,color=NA) + 
    theme_bw()+coord_flip() 

enter image description here

Kolor można dodawać ręcznie za pomocą hack, choć:

gg_color_hue <- function(n) { 
    hues = seq(15, 375, length=n+1) 
    hcl(h=hues, l=65, c=100)[1:n] 
} 

cols <- rep(gg_color_hue(6),4) 

ggplot(CTscores.m, aes(x=variable, y=value)) + 
    geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03,fill=cols,color=NA) + 
    theme_bw()+coord_flip() 

enter image description here

Niestety, nie ma legenda. Ponadto nie można użyć aes(fill=), aby spróbować ręcznie dodać legendę, ponieważ spowoduje ona zwinięcie kropek. Czy istnieje sposób dodania legendy bez użycia aes()?

+0

można użyć tej samej metody stosowane w odpowiedzi na [to pytanie] (http://stackoverflow.com/q/1364 9473/1412059). – Roland

+0

@Roland To się udało. Dzięki. –

Odpowiedz

1

Z pomocą pakietu gtable można wyodrębnić legendę od działce o legendzie, która nie układać kropki i dodać tę legendę z grid.arrange z pakietu gridExtra do działki z kolorowych ans ułożone kropki w następujący sposób:

p1 <- ggplot(CTscores.m, aes(x=variable, y=value)) + 
    geom_dotplot(binaxis="y", stackdir="up", binwidth=0.03, fill=cols, color=NA) + 
    coord_flip() + 
    theme_bw() 

p2 <- ggplot(CTscores.m, aes(x=variable, y=value, fill=initials)) + 
    geom_dotplot(binaxis="y", stackdir="up", binwidth=0.03, color=NA) + 
    coord_flip() + 
    theme_bw() 

library(gtable) 
fill.legend <- gtable_filter(ggplot_gtable(ggplot_build(p2)), "guide-box") 
legGrob <- grobTree(fill.legend) 

library(gridExtra) 
grid.arrange(p1, legGrob, ncol=2, widths = c(4,1)) 

co daje:

enter image description here

Powiązane problemy