gpt4 book ai didi

r - 与 cowplot 和 plot_grid 共享面板边框

转载 作者:行者123 更新时间:2023-12-04 12:46:32 27 4
gpt4 key购买 nike

我正在尝试在与 plot_grid 对齐的两个图周围绘制边框来自牛图包。请看下面的例子(修改自 "Changing the axis positions" vignette ):

require(gtable)
require(cowplot)

# top plot
p1 <- ggplot(mtcars, aes(mpg, disp)) + geom_line(colour = 'blue') +
background_grid(minor = 'none')
g1 <- switch_axis_position(p1, 'xy') # switch both axes
g1 <- gtable_squash_rows(g1, length(g1$height)) # set bottom row to 0 height

# bottom plot
p2 <- ggplot(mtcars, aes(mpg, qsec)) + geom_line(colour = 'green') + ylim(14, 25) +
background_grid(minor = 'none')
g2 <- ggplotGrob(p2)
g2 <- gtable_add_cols(g2, g1$widths[5:6], 4) # add the two additional columns that g1 has
g2 <- gtable_squash_rows(g2, 1:2) # set top two rows to 0 height

plot_grid(g1, g2, ncol = 1, align = 'v') +
annotate("rect", xmin = 0.1, xmax = 0.9, ymin = 0.1, ymax = 0.9,
color = "red", fill = NA)

example

现在,我想让它与轴线对齐,而不是为红框任意选择坐标。我假设这些坐标可以从 plot_grid 中提取出来。输出,但我不知道如何。

最佳答案

根据我对 grobs 的理解,我想说在使用 plot_grid 组合图之前,更容易获得每个图的坐标并添加边界段。 .

示例数据 :

library(gtable)
library(cowplot)

# sample plots
# (note: the cowplot function switch_axis_position has been deprecated, as its
# creator notes ggplot2 now natively supports axes on either side of the plot.)
p1 <- ggplot(mtcars, aes(mpg, disp)) +
geom_line(colour = 'blue') +
scale_x_continuous(position = "top") +
scale_y_continuous(position = "right") +
background_grid(minor = 'none'); p1

p2 <- ggplot(mtcars, aes(mpg, qsec)) +
geom_line(colour = 'green') +
ylim(14, 25) +
background_grid(minor = 'none'); p2

# convert to grob objects
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)

功能 为每个 plot grob 添加适当的边界段,其中:
  • grob是通过 ggplotGrob 创建的 grob 对象;
  • sides是包含"t"的任意组合的字符串/"l"/"b"/"r"以任何顺序指示边界放置所需的边;
  • col是所需的边框颜色(默认为红色);
  • ...用于将任何其他参数传递给 gpar()segmentsGrob()

  • .
    library(grid)

    add.segments <- function(grob, sides = "tlbr", col = "red", ...){

    # get extent of gtable cells to be surrounded by border
    panel.coords <- g1[["layout"]][g1[["layout"]][["name"]] == "panel", ]
    t <- if(grepl("t", sides)) panel.coords[["t"]] else 1
    b <- if(grepl("b", sides)) panel.coords[["b"]] else length(grob[["heights"]])
    l <- if(grepl("l", sides)) panel.coords[["l"]] else 1
    r <- if(grepl("r", sides)) panel.coords[["r"]] else length(grob[["widths"]])

    # define border coordinates, & filter for the desired border sides
    coords <- data.frame(direction = c("t", "b", "l", "r"),
    x0 = c(0, 0, 0, 1), y0 = c(1, 0, 0, 0),
    x1 = c(1, 1, 0, 1), y1 = c(1, 0, 1, 1),
    stringsAsFactors = FALSE)
    coords <- coords[sapply(coords$direction, grepl, sides), ]

    # add desired border sides as segments to the grob at specific gtable cells
    grob <- gtable_add_grob(x = grob,
    grobs = segmentsGrob(
    x0 = coords[["x0"]], y0 = coords[["y0"]],
    x1 = coords[["x1"]], y1 = coords[["y1"]],
    gp = gpar(col = col, ...)
    ),
    t = t, l = l, b = b, r = r,
    clip = "off", name = "segments")

    return(grob)
    }

    用法 :
    plot_grid(add.segments(g1, "tlr"), 
    add.segments(g2, "lbr"),
    ncol = 1, align = "v")

    plot

    另一个示例,用于水平对齐两个图(好吧,将这些特定图并排对齐是没有意义的,但您明白了):
    plot_grid(add.segments(g2, "tlb", col = "gold2", lty = 2, lwd = 5), 
    add.segments(g1, "trb", col = "gold2", lty = 2, lwd = 5),
    nrow = 1, align = "h")

    plot 2

    关于r - 与 cowplot 和 plot_grid 共享面板边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36167691/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com