2013-03-27 112 views
0

亞組我想繪製以下數據集:傳說與GGPLOT2

data<-list() 
data$Year<-c(rep(1995,4),rep(2005,4)) 
data$Name<-as.factor(c("name1","name2","name3","name4","name1","name2","name3","name4")) 
data$species<-as.factor(c("cat","cat","dog","dog","cat","cat","dog","dog")) 
data$Value<-c(1,2,3,4,5,6,7,8) 
data<-as.data.frame(data) 

這是我所希望的描繪

p<-ggplot(data, aes(x=Year, y=Value,fill=Name, colour=Name,linetype=species,shape=species)) 
p<-p+geom_point() 
p<-p+geom_line() 

我想不同的傳說不過。首先,圖例應該包含每個'名稱'的正確符號(顏色,線型和形狀)的一個條目。我可以通過執行以下操作做到這一點(的線型不完全匹配,不好意思):

#Plot with better legend 
gg_color_hue <- function(n) { 
    hues = seq(15, 375, length=n+1) 
    hcl(h=hues, l=65, c=100)[1:n] 
} 
p2<-ggplot(data, aes(x=Year, y=Value,fill=Name, colour=Name,linetype=Name,shape=Name)) 
p2<-p2+scale_linetype_manual(values=c(1,1,2,2),breaks=levels(data$Name),name="test") 
p2<-p2+scale_shape_manual(values=c(16,16,17,17),breaks=levels(data$Name),name="test") 
p2<-p2+scale_colour_manual(values=gg_color_hue(4),breaks=levels(data$Name),name="test") 
p2<-p2+scale_fill_manual(values=gg_color_hue(4),breaks=levels(data$Name),name="test") 
p2<-p2+geom_point(show_guide=T) 
p2<-p2+geom_line(show_guide=T) 

但是現在有貓,狗沒有什麼區別了。因此,我想有傳說中的字幕(或基本上是兩種傳說): 事情是這樣的:

cats 
symbol(name1) name1 
symbol(name2) name2 

dogs 
symbol(name3) name3 
symbol(name4) name4 

有人可以幫我在這?謝謝。

+1

也許你可以addapt [該解決方案(http://stackoverflow.com/questions/15462203/modify-legend-in-facetted-plot- ggplot2/15463216#15463216) – 2013-03-27 11:29:32

+0

這樣做,非常感謝。 – user2215127 2013-03-27 12:48:22

回答

0

Didzis Elferts請指點我this線程提供使用包gridExtra的解決方案。 這對我來說原則上是行得通的(見下面的代碼),但我們已經擁有了自己的一套庫,不幸的是它有一些與gridExtra包(getNames)相沖突的方法。有沒有一種方法不依賴於gridExtra包?

這裏我的例子代碼gridExtra:

pcat<-ggplot(subset(data,species=="cat"), aes(x=Year, y=Value,fill=Name, colour=Name))+geom_point(shape=16)+geom_line(linetype=1)+guides(colour=guide_legend(title="cat"),shape=guide_legend(title="cat"),linetype=guide_legend(title="cat"),fill=guide_legend(title="cat")) 
ppcat<-ggplot_gtable(ggplot_build(pcat)) 
legcat<-ppcat$grobs[[8]] 

pdog<-ggplot(subset(data,species=="dog"), aes(x=Year, y=Value,fill=Name, colour=Name))+geom_point(shape=1)+geom_line(linetype=2)+guides(colour=guide_legend(title="dog"),shape=guide_legend(title="dog"),linetype=guide_legend(title="dog"),fill=guide_legend(title="dog")) 
ppdog<-ggplot_gtable(ggplot_build(pdog)) 
legdog<-ppdog$grobs[[8]] 

library(gridExtra) 
grid.arrange(arrangeGrob(p,arrangeGrob(legcat,legdog),ncol=2,widths=c(4/5,1/5)))