Arrangement of legends in the combined ggplot

I'm new to R, not to mention ggplot, so I apologize in advance for any problems with my example below.

Using examples from existing questions, I tried to compile code to combine two separate ggplots. I am wondering how I can move the legend of the final plot, which will be located above the chart. I tried changing legend.postion to "top" for individual ggplots, but it does not seem to work.

(Note that I refused to create a second y axis to keep the code in the example to the minimum of what, in my opinion, is necessary to illustrate my problem)

library(ggplot2) library(gtable) library(reshape2) library(grid) library(scales) df.test <- data.frame( x_cat = factor(c(1, 2, 3, 4)), count = seq(1:4), line1 = seq(from = 1, to = 4, length.out = 4), line2 = seq(from = 0, to = 3, length.out = 4) ) p1 <- ggplot( data = df.test , aes(x=x_cat, y=count) ) + geom_bar( stat="identity" ) + xlab( "X Label" ) + ylab( "Y Label 1" ) + theme(panel.background = element_rect(colour = "white"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "bottom") g1 <- ggplotGrob( p1 ) df.test2 <- melt( df.test[-2] ) p2 <- ggplot( data = df.test2 , aes(x=x_cat, y=value, colour=variable ) ) + geom_line( aes(group=variable) ) + ylab( "Y Label 2" ) + theme(panel.background = element_rect(fill = NA, colour = "white"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "bottom") g2 <- ggplotGrob(p2) pp <- c(subset(g1$layout, name == "panel", se = t:r)) g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, pp$l, pp$b, pp$l) pp <- c(subset(g2$layout, name == "guide-box", se = t:r)) g <- gtable_add_grob(g, g2$grobs[[which(g2$layout$name == "guide-box")]], t=pp$t, l=pp$l, b=pp$b, r=pp$r) grid.draw(g) 
+5
source share
1 answer

You do not need to combine two separate graphs. The ggplot approach is to consider this as a single plot with two layers, a bar layer and a linear layer. Therefore, we just need to figure out how to place these layers in one area. For instance:

 library(ggplot2) library(reshape2) df.test <- data.frame( x_cat = factor(c(1, 2, 3, 4)), count = seq(1:4), line1 = seq(from = 1, to = 4, length.out = 4), line2 = seq(from = 0, to = 3, length.out = 4) ) df.test2 = melt(df.test, id.var=c("x_cat", "count")) ggplot() + geom_bar(data=subset(df.test2, variable=="line1"), aes(x=x_cat, y=count), stat="identity" ) + geom_line(data=df.test2, aes(x=x_cat, y=value, colour=variable, group=variable)) + xlab( "X Label" ) + ylab( "Y Label 1" ) + theme(panel.background = element_rect(colour = "white"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "top") 

enter image description here

It turned out that we did not need any legendary gymnastics. However, if you ever need to combine separate stories with one legend, here , here and here are examples.

+2
source

Source: https://habr.com/ru/post/1257466/


All Articles