簡體   English   中英

ggplot,在facet上繪制多條線

[英]ggplot, drawing multiple lines across facets

我使用ggplot2 facet在一列中繪制了兩個面板,並希望在x = 4和8的面板上添加兩條垂直線。以下是代碼:

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

dat <- data.frame(x=rep(1:10,2),y=1:20+rnorm(20),z=c(rep("A",10),rep("B",10)))

P <- ggplot(dat,aes(x,y)) + geom_point() + facet_grid(z~.) + xlim(0,10)
Pb <- ggplot_build(P);Pg <- ggplot_gtable(Pb)

for (i in c(4,8)){
    Pg <- gtable_add_grob(Pg, moveToGrob(i/10,0),t=8,l=4)
    Pg <- gtable_add_grob(Pg, lineToGrob(i/10,1),t=6,l=4)
}

Pg$layout$clip <- "off"
grid.newpage()
grid.draw(Pg)

上面的代碼修改自: ggplot,跨越facet的點之間的繪制線 這是輸出數字

這個圖有兩個問題。 首先,只顯示了一條垂直線。 似乎moveToGrob只工作了一次。其次,顯示的行在x = 4時並不准確。我沒有找到Pb$panel$ranges變量,那么有沒有辦法可以糾正范圍呢? 非常感謝。

已更新至ggplot2 V3.0.0

在面板具有共同軸並且線條延伸到整個y范圍的簡單場景中,您可以在整個gtable單元格上繪制線條,找到正確的npc坐標轉換(參見之前的帖子,因為ggplot2不斷變化而更新),

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

dat <- data.frame(x=rep(1:10,2),y=1:20+rnorm(20),z=c(rep("A",10),rep("B",10)))

p <- ggplot(dat,aes(x,y)) + geom_point() + facet_grid(z~.) + xlim(0,10)
pb <- ggplot_build(p)
pg <- ggplot_gtable(pb)


data2npc <- function(x, panel = 1L, axis = "x") {
  range <- pb$layout$panel_params[[panel]][[paste0(axis,".range")]]
  scales::rescale(c(range, x), c(0,1))[-c(1,2)]
}


start <- sapply(c(4,8), data2npc, panel=1, axis="x")

pg <- gtable_add_grob(pg, segmentsGrob(x0=start, x1=start, y0=0, y1=1, gp=gpar(lty=2)), t=7, b=9, l=5)

grid.newpage()
grid.draw(pg)

在此輸入圖像描述

您可以使用geom_vline並完全避免grid混亂:

ggplot(dat, aes(x, y)) + 
    geom_point() + 
    geom_vline(xintercept = c(4, 8)) + 
    facet_grid(z ~ .) + 
    xlim(0, 10)

與vlines的情節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM