Нарисовать линии между двумя гранями в ggplot2

#r #plot #ggplot2 #visualization

#r #построить #ggplot2 #визуализация

Вопрос:

Как я могу нарисовать несколько линий между двумя гранями?

Я попытался сделать это, начертив точки с минимальным значением верхнего графика, но они не находятся между двумя гранями. Смотрите рисунок ниже.

введите описание изображения здесь

Пока это мой код:

 t <- seq(1:1000)
y1 <- rexp(1000)
y2 <- cumsum(y1)
z <- rep(NA, length(t))
z[100:200] <- 1

df <- data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes","Changes"), each=1000))
points <- data.frame(x=c(10:200,300:350), y=min(y2), type=rep("Bytes",242))
vline.data <- data.frame(type = c("Bytes","Bytes","Changes","Changes"), vl=c(1,5,20,5))

g <- ggplot(data=df, aes(x=t, y=values))  
  geom_line(colour=I("black"))  
  facet_grid(type ~ ., scales="free")  
  scale_y_continuous(trans="log10")  
  ylab("Log values")  
  theme(axis.text.x = element_text(angle = 90, hjust = 1), panel.margin = unit(0, "lines")) 
  geom_point(data=points, aes(x = x, y = y), colour="green")

g
  

Комментарии:

1. Как насчет использования grid.lines из package grid

2. Добавьте , panel.background = element_rect(colour="black") в свой theme

Ответ №1:

Чтобы достичь этого, вы должны установить поля внутри графика равными нулю. Вы можете сделать это с помощью expand=c(0,0) . Изменения, которые я внес в ваш код:

  • При использовании scale_y_continuous вы можете определить метку оси внутри этой части, и вам не нужен отдельный элемент ylab .
  • Изменено colour=I("black") на colour="black" inside geom_line .
  • Добавлено expand=c(0,0) в scale_x_continuous и scale_y_continuous .

Полный код:

 ggplot(data=df, aes(x=t, y=values))  
  geom_line(colour="black")  
  geom_point(data=points, aes(x = x, y = y), colour="green")  
  facet_grid(type ~ ., scales="free")  
  scale_x_continuous("t", expand=c(0,0))  
  scale_y_continuous("Log values", trans="log10", expand=c(0,0))  
  theme(axis.text.x=element_text(angle=90, vjust=0.5), panel.margin=unit(0, "lines"))
  

что дает:
введите описание изображения здесь


Добавление линий также можно выполнить с помощью geom_segment . Обычно линии (сегменты) будут отображаться в обеих гранях. Если вы хотите, чтобы они отображались между двумя гранями, вам придется ограничить это в data параметре:

 ggplot(data=df, aes(x=t, y=values))  
  geom_line(colour="black")  
  geom_segment(data=df[df$type=="Bytes",], aes(x=10, y=0, xend=200, yend=0), colour="green", size=2)  
  geom_segment(data=df[df$type=="Bytes",], aes(x=300, y=0, xend=350, yend=0), colour="green", size=1)  
  facet_grid(type ~ ., scales="free")  
  scale_x_continuous("t", expand=c(0,0))  
  scale_y_continuous("Log values", trans="log10", expand=c(0,0))  
  theme(axis.text.x=element_text(angle=90, vjust=0.5), panel.margin=unit(0, "lines"))
  

что дает:
введите описание изображения здесь

Комментарии:

1. Я использовал geom_point для построения линий, которые я хочу. Линии могут быть непоследовательными. Итак, мой вопрос в том, как добавить эти зеленые линии точно посередине двух графиков.

2. @Enrique Смотрите мой обновленный ответ, это то, что вы ищете?

3. @Enrique Смотрите мой обновленный ответ, я также добавил другой метод рисования линий.