Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
843 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 Answer

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)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...