簡體   English   中英

ggplot:構面之間的剪切線

[英]ggplot: clipping lines between facets

說我有這樣的情節:

# 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)

在此處輸入圖片說明

現在,我想在條形圖所在的兩個面上繪制線條。 我添加以下內容:

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

在此處輸入圖片說明

這會增加線條,但它們不會同時穿過兩個方面。 因此,我嘗試使用以下解決方案關閉剪輯:

# 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"來關閉所有可能的裁剪,但這並不能解決問題。)是否有解決方法?

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,在各個構面上繪制多條線以了解如何重新調整值以進行更一般的繪制。

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)

暫無
暫無

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

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