Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
866 views
in Technique[技术] by (71.8m points)

r - Draw lines between two different ("grid.arranged") plots

So i have managed to create two ggplot-graphs and plot them perfectly aligned with grid.arrange. Now i would like to connect the min, 1Q, 3Q and max of the boxplot with the distribution in the left graph. I have plotted horizontal (red striped) lines with geom_hline in both graphs, but i would like to have these lines connected, so also go through the white space between the graphs. Any suggestions? Here's the graph: enter image description here

Oh yeah, complicating factor: the right graphs has it's coordinates flipped!

Here's a reproducible example:

library(ggplot2)
library(scales)
library(gridExtra)

# create some data
df_ahn <- data.frame(yh=rnorm(1000,0.23,0.05))
df_peil <- data.frame(hoogte = rnorm(1000,0,1))

# vector met de hoogtes
Summary_df <- summary(df_ahn$yh)

p_peil <- ggplot(df_peil,aes(x=hoogte))+
  geom_histogram(aes(y=cumsum((..count..)/sum(..count..))), binwidth = 0.01,fill="gray")+
  stat_bin(aes(y=cumsum((..count..)/sum(..count..))),binwidth = 0.01,geom="line",color="black") +
  geom_vline(aes(xintercept = as.vector(Summary_df[1])), lty = 2,color =2)+
  geom_vline(aes(xintercept = as.vector(Summary_df[2])), lty = 2,color =2)+
  geom_vline(aes(xintercept = as.vector(Summary_df[5])), lty = 2,color =2)+
  geom_vline(aes(xintercept = as.vector(Summary_df[6])), lty = 2,color =2)+
  coord_flip() +
  ggtitle("Onderschrijdingsfrequentie
 waterstand in kreek") +
  xlab("Hoogte in meter NAP") +
  ylab("Onderschrijdingsfrequentie in % (10% = 36,5 dagen/jaar)") +
  scale_y_continuous(limits = c(0, 1),labels = percent, breaks=seq(0,1,by=0.1)) +
  scale_x_continuous(limits = c(-0.5, 0.6), breaks=seq(-0.5,0.6,by=0.1)) +
  theme(panel.background = element_rect(fill = "transparent",colour = "black"),
        panel.grid.major = element_line(colour = "darkgray"),
        panel.grid.minor = element_line(colour = "gray"),
        strip.background = element_rect(fill="gray"),
        strip.text = element_text(size=14, color="black"),
        axis.ticks.y = element_line(colour = "black"),
        axis.ticks.x = element_line(colour = "black"),
        axis.text.x = element_text(size=14, color="black"),
        axis.text.y = element_text(size=14, color="black"),
        axis.title = element_text(size=14, color="black")
  )

p_ahn <-    ggplot(df_ahn, aes(x=1, y=yh)) +
  geom_boxplot(outlier.size=3, outlier.shape=1) +
  geom_hline(aes(yintercept = as.vector(Summary_df[1])), lty = 2,color =2)+
  geom_hline(aes(yintercept = as.vector(Summary_df[2])), lty = 2,color =2)+
  geom_hline(aes(yintercept = as.vector(Summary_df[5])), lty = 2,color =2)+
  geom_hline(aes(yintercept = as.vector(Summary_df[6])), lty = 2,color =2)+
  scale_y_continuous(limits = c(-0.5,0.6), breaks=seq(-0.5,0.6,by=0.1)) +
  ggtitle("Hoogte groeiplaatsen
Kruipend moerascherm") +
  ylab("") +
  xlab("") +
  theme(panel.background = element_rect(fill = "transparent",colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        strip.background = element_rect(fill="gray"),
        strip.text = element_text(size=14, color="black"),
        axis.ticks.y = element_line(colour = "black"),
        axis.ticks.x = element_line(colour = "white"),
        axis.text.x = element_text(size=14, color="white"),
        axis.text.y = element_text(size=14, color="black"),
        axis.title = element_text(size=14, color="black", face="bold")

  ) 
grid.arrange(p_peil,p_ahn, layout_matrix = matrix(c(1,1,1,2), nrow=1, byrow=TRUE), ncol = 4)
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You could extract the line from one of the plots, and add it to the whole region of the combined gtable,

enter image description here

library(ggplot2)
library(gtable)
library(grid)

set.seed(123)
y <- rnorm(10)
p1 <- qplot(1:10, y) +
  geom_hline(yintercept=0, lty=3)

p2 <- qplot(1:10, 10*y) +
  geom_hline(yintercept=0)

#library(gridExtra)
#grid.arrange(p1,p2,widths=c(3,1)) # no line

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
lines <- g1$grobs[[4]][["children"]][[3]]
g1$grobs[[4]][["children"]][[3]] <- NULL # remove line
g2$grobs[[4]][["children"]][[3]] <- NULL # remove line
g <- cbind(g1,g2,size="first")
g$heights <- unit.pmax(g1$heights, g2$heights)
g$widths[[9]] <- unit(1/3, "null")
g <- gtable_add_grob(g, lines, l=4, t=3, r=9, z=Inf)
grid.newpage()
grid.draw(g)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...