在两个组合的ggplots之间共享一个图例

时间:2014-07-25 08:46:44

标签: r data-visualization ggplot2

我目前正在尝试使用ggplot2呈现两个时间序列,两者都有不同的比例,使用两个ggplots。我使用grid.arrange合并了两个单独的ggplots,一个在另一个之上。为了帮助实现可视化,我希望使每条线都成为不同的颜色,并在组合图下面显示这个图例。

由于这可能是相关的,我目前正致力于创建R降价文档的闪亮部分。因此,renderPlot包装器围绕grid.arrange

以下内容类似于我目前的代码。

testdata = data.frame(var1 = seq(0,10,by=1), var2 = runif(11), 
var3 = runif(11, min = 100, max = 500))

renderPlot({grid.arrange(
ggplot(data = testdata, aes(x = var1, y = var2))
+ geom_line(colour = "blue") + xlab(NULL),
ggplot(data = testdata, aes(x = var1, y = var3)) + geom_line(colour = "red"))})

有没有人对如何创建共享图例有任何建议?非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

使用ggplot2我通常使用以下两种方法来创建一个共同的图例:

方法1:当比例相似时

通过将facet_gridcolor参数与reshape2包结合使用,您可以轻松地将多个图表与相同的图例组合在一起。但是,如果变量中的值具有相似的大小顺序,则这是理想的。

使用color& reshape2

library('reshape2')
data_melt<-melt(data=testdata,value.name='Value',id.vars='var1')

ggplot(data_melt)+
  geom_line(aes(x=var1,y=Value,color=variable))

High difference in magnitude leads to a poor plot, but similar scales might result in a good plot

使用colorfacet_grid&amp; reshape2

library('reshape2')
data_melt<-melt(data=testdata,value.name='Value',id.vars='var1')

ggplot(data_melt)+
 geom_line(aes(x=var1,y=Value,color=variable))+
 facet_grid(~variable)

High difference in magnitude leads to a poor plot, but similar scales might result in a good plot

方法2:当比例差别很大时

Value vs ID plot : combined

正如你所看到的,最后的情节很棒! 您所需要的只是制作一个包含您的传奇故事的情节。将其作为输入参数传递给wiki here中创建的自定义函数。

testdata = data.frame(var1 = seq(0,10,by=1), var2 = runif(11), 
                  var3 = runif(11, min = 100, max = 500))

library('reshape2')
data_melt<-melt(data=testdata,value.name='Value',id.vars='var1')

p1=ggplot(data = testdata)+
  geom_line(aes(x = var1, y = var2,color='blue'))

p2=ggplot(data = testdata) + 
  geom_line(aes(x = var1, y = var3,color='red'))

p3=ggplot(data_melt)+
   geom_line(aes(x=var1,y=Value,color=variable))

grid.arrange(p1,p2,nrow=2,main='Line Plots')

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p3)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                         p2 + theme(legend.position="none"),
                         main ="Variable Name",
                         left = "Value"),
             legend, 
             widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)