2017-07-17 22 views
1

之间裁剪线说我有一个情节是这样的:ggplot:面

# Load libraries 
library(ggplot2) 
library(grid) 

# Load data 
data(mtcars) 

# Plot results 
p <- ggplot(data = mtcars) 
p <- p + geom_bar(aes(cyl)) 
p <- p + coord_flip() 
p <- p + facet_wrap(~am) 

print(p) 

enter image description here

现在,我想在这两个方面在酒吧情节主线一路。我补充一点:

p <- p + geom_vline(aes(xintercept = cyl)) 

enter image description here

它增加了线,但他们不越过这两个方面。因此,我尝试使用此解决方案关闭剪辑:

# Turn off clipping 
gt <- ggplot_gtable(ggplot_build(p)) 
gt$layout$clip[gt$layout$name == "panel"] <- "off" 

# Plot results 
grid.draw(gt) 

但这并不能解决问题:行仍然被剪切。所以,我想知道这是否是特定于geom_vline,并试图与geom_ablinegeom_line(后者的值在±Inf之间)接近,但结果是相同的。在其他文章中,裁剪解决方案似乎适用于文本和点,但大概在这种情况下,线条仅在图的范围内定义。 (我甚至尝试过gt$layout$clip <- "off"关闭所有可能的剪辑,但这并没有解决问题。)是否有解决方法?

+2

是否[此答案](https://stackoverflow.com/a/31691313/496488)做你需要什么? – eipi10

+0

它看起来确实如此。谢谢!显然我今天特别弱Google Fu ... – Lyngbakr

+0

其实,这段代码似乎不适合我(或者几个小时前发布的其他人)。任何人都可以成功地运行它吗? – Lyngbakr

回答

0
library(grid) 
library(gtable) 

# Starting from your plot `p` 
gb <- ggplot_build(p) 
g <- ggplot_gtable(gb) 

# Get position of y-axis tick marks 
ys <- gb$layout$panel_ranges[[1]][["y.major"]] 


# Add segments at these positions 
# subset `ys` if you only want to add a few 
# have a look at g$layout for relevant `l` and `r` positions 
g <- gtable_add_grob(g, segmentsGrob(y0=ys, y1=ys, 
            gp=gpar(col="red", lty="dashed")), 
        t = 7, l = 4, r=8) 

grid.newpage() 
grid.draw(g) 

请参阅ggplot, drawing multiple lines across facets了解如何重新缩放数值以获得更一般的绘图。即

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

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

g <- gtable_add_grob(g, segmentsGrob(y0=start, y1=start), 
         t=7, r=4, l=8)