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_abline
和 geom_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)
请参阅 以了解如何为更一般的绘图重新调整值。即
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)
假设我有这样的情节:
# 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_abline
和 geom_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)
请参阅
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)