R语言 使用拼接创建一个带面网格

nwsw7zdq  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(205)

我使用的specific function在网格搜索算法中返回ggplot,我想在绘图网格中排列结果图,就像facet_grid()一样。
我不能使用标准的方面,因为每个场景只能在特定的尺度下解释,所以每个图都有独立的x/y限制。
下面是一个可重复的例子:

library(tidyverse)
library(patchwork)
get_plot = function(a, b) list(ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
                                 geom_point() + ggtitle(paste0(a, "--", b)))
x = expand_grid(dist_fun = c("rnorm", "rexp"),
                assumption=c("linear", "square")) %>%
  rowwise() %>%
  mutate(plot=get_plot(dist_fun, assumption))
x
#> # A tibble: 4 × 3
#> # Rowwise: 
#>   dist_fun assumption plot  
#>   <chr>    <chr>      <list>
#> 1 rnorm    linear     <gg>  
#> 2 rnorm    square     <gg>  
#> 3 rexp     linear     <gg>  
#> 4 rexp     square     <gg>

#expected outcome, missing strips:
wrap_plots(x$plot)

字符串
x1c 0d1x的数据
创建于2023-12-08带有reprex v2.0.2
有没有办法把ggtitle的标识替换成刻面状的条?

92dk7w1h

92dk7w1h1#

好吧,这不是关于使用哪个函数的问题。要使用patchwork获得类似facet_grid的外观,需要您编写一个自定义函数,在将ggplot对象传递给wrap_plots之前对其进行操作。为此,我首先添加了一个包含补丁中数字位置的列。然后,使用自定义函数,您可以删除轴,并根据位置添加条带:
注意事项:虽然我喜欢这样的patchwork练习,但恕我直言,更简单的方法是从你的函数或包含数据和图的列表中返回数据,然后使用rbind/bind_rows + facet_grid,就像评论中已经建议的那样。

library(tidyverse)
library(patchwork)

get_plot <- function(a, b) {
  list(ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
    geom_point())
}
x <- expand_grid(
  dist_fun = c("rnorm", "rexp"),
  assumption = c("linear", "square")
) %>%
  mutate(plot = get_plot(dist_fun, assumption))

x |>
  mutate(pos = row_number()) |>
  pmap(
    \(...) {
      args <- list(...)
      col <- 1 + (args$pos + 1) %% 2
      row <- 1 + (args$pos - 1) %/% 2

      remove_x <- if (row == 1) {
        theme(
          axis.text.x = element_blank(),
          axis.ticks.x = element_blank(),
          axis.ticks.length.x = unit(0, "pt")
        )
      }
      remove_y <- if (col == 2) {
        theme(
          axis.text.y = element_blank(),
          axis.ticks.y = element_blank(),
          axis.ticks.length.y = unit(0, "pt")
        )
      }

      facet_y <- if (row == 1) {
        # Wrap in quotes to get e.g.
        # "linear" ~ . instead of linear ~ .
        paste0("\"", args$assumption, "\"")
      } else {
        "."
      }
      facet_x <- if (col == 2) {
        paste0("\"", args$dist_fun, "\"")
      } else {
        "."
      }

      layer_facet <- facet_grid(reformulate(facet_y, facet_x))

      args$plot +
        remove_x +
        remove_y +
        layer_facet
    }
  ) |>
  wrap_plots(ncol = 2) &
  theme(
    axis.title = element_blank()
  )

字符串
x1c 0d1x的数据

dl5txlt9

dl5txlt92#

正如其他人所说,最简单的方法是使用x对象,去掉数据,在基本的图结构中添加面。例如,下面的函数:

facetize <- function(x) {
  base_plot <- x$plot[[1]]
  x_nm <- names(x)
  base_plot$data <- x %>%
    mutate(plot_data = map(plot, `[[`, 'data')) %>%
    select(-plot) %>%
    unnest(plot_data)
  base_plot + 
    facet_grid(rows = vars(!!str2lang(x_nm[1])), 
               cols = vars(!!str2lang(x_nm[2])),
               scales = 'free')
}

字符串
允许:

facetize(x)


的数据

相关问题