2015-08-22 6 views
2

Так что мне удалось создать два графика ggplot и построить их идеально совмещенные с grid.arrange. Теперь я хотел бы подключить min, 1Q, 3Q и max boxplot с распределением на левом графике. Я построил горизонтальные (красные полосатые) линии с geom_hline на обоих графиках, но мне хотелось бы, чтобы эти линии были связаны, так что пройдите через пробел между графиками. Какие-либо предложения? Вот график: enter image description hereНарисуйте линии между двумя разными («grid.arranged») графиками

О да, усложняющий фактор: на правильных графах его координаты перевернуты!

Вот воспроизводимый пример:

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\n 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\nKruipend 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) 
+1

[Этот вопрос и ответы] (http://stackoverflow.com/questions/17492230/how-to-place-grobs-with-annotation-custom-at-precise-areas-of-the-plot-region) могут иметь значение. – Henrik

+0

или [этот] (http://stackoverflow.com/questions/31690007/ggplot-drawing-line-between-points-across-facets/31691313#31691313). Мне кажется, что фацетинг будет лучшим вариантом. – baptiste

ответ

2

Вы можете извлечь строку из одного из участков, и добавить его на весь регион совмещенной 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) 
+0

Спасибо @baptiste за ответ и 'widths'-TIP. Однако ваш код дает ошибку ** Ошибка в ммм <каждый: сравнение этих типов не выполняется ** после строки 'cbind'. Я не familiair с gtable, так что не могу понять, почему. Есть идеи? BTW: Я предоставил образцы данных (и забыл удалить нерелевантную строку 'setwd'). – RHA

+0

Извините, это всегда меня било, поэтому я настраивал функцию cbind.gtable в gridExtra, но она экспортировалась только в dev-версии. Я внесла поправки в код для работы с официальной версией gtable. – baptiste

Смежные вопросы