我目前正在尝试使用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"))})
有没有人对如何创建共享图例有任何建议?非常感谢你的帮助。
答案 0 :(得分:3)
使用ggplot2
我通常使用以下两种方法来创建一个共同的图例:
方法1:当比例相似时
通过将facet_grid
或color
参数与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))
使用color
,facet_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)
方法2:当比例差别很大时
正如你所看到的,最后的情节很棒! 您所需要的只是制作一个包含您的传奇故事的情节。将其作为输入参数传递给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)