2013-03-27 62 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)))