【问题标题】:Passing labels to xlab and ylab in ggplot2在ggplot2中将标签传递给xlab和ylab
【发布时间】:2019-07-06 22:14:37
【问题描述】:

我创建了一个函数,其目标是以矢量化方式创建一系列图。这些函数部分完成了我想要的更新,即根据所选变量更新图。但是,我无法传递标签参数(即 label_x 和 label_y),因此 xlab 和 ylab 会持续更新。

library(tidyverse)
plot_scatter_with_label <- function(df,
                                    var_x,
                                    var_y,
                                    label_x,
                                    label_y,
                                    geom_smooth = FALSE,
                                    point_shape = 16,
                                    point_color = "#EB3300",
                                    point_size = 1,
                                    point_alpha = 1,
                                    smooth_method = "loess",
                                    smooth_se = FALSE,
                                    smooth_color = "navy") {
  df <- data.frame(lapply(df, function(x) as.numeric(as.character(x))))
  scatter_plot <- function(x, y) {
    p <- ggplot(df, aes_string(x = x, y = y)) + 
      geom_point(shape = point_shape, color = point_color, size = point_size, alpha = point_alpha) + 
      ylab(label_y) + xlab(label_x)
    p
  }
  map2(
    var_y, label_y,
    ~ map(var_x, scatter_plot, y = .x)
  )
}

示例

plot_scatter_with_label(
  df = mtcars,
  var_y = c("mpg", "hp"),
  label_y = c("Miles per gallon [Mpg]", "Horse power [CV]"),
  var_x = c("cyl", "gear"),
  label_x = c("Cylinders [n]", "Gear [n]")
)

我期待获得以下地块:

1) mpg 与 cyl

2) mpg 与齿轮

3) 马力与气缸

4) 马力与齿轮

似乎我得到了这 4 个图,但标签没有按预期更新。它总是返回 label_x 和 label_y 中定义的第一个参数。

任何帮助将不胜感激。

最好的问候,

【问题讨论】:

标签: r ggplot2 purrr tidyeval


【解决方案1】:

我们可以使用pmappwalk将数据传递给plot_scatter_with_label函数

library(tidyverse)

plot_scatter_with_label <- function(dat,
                                    var_x,
                                    var_y,
                                    label_x,
                                    label_y,
                                    geom_smooth = FALSE,
                                    point_shape = 16,
                                    point_color = "#EB3300",
                                    point_size = 1,
                                    point_alpha = 1,
                                    smooth_method = "loess",
                                    smooth_se = FALSE,
                                    smooth_color = "navy") {

  if (is.character(var_x)) {
    print('character column names supplied, use rlang::sym()')
    var_x <- rlang::sym(var_x)
  } else {
    print('bare column names supplied, use dplyr::enquo()')
    var_x <- enquo(var_x)
  }

  if (is.character(var_y)) {
    var_y <- rlang::sym(var_y)
  } else {
    var_y <- enquo(var_y)
  }

  p <- ggplot(dat, aes(x = !! var_x, y = !! var_y)) + 
    geom_point(shape = point_shape, color = point_color, 
               size = point_size, alpha = point_alpha) + 
    ylab(label_y) + 
    xlab(label_x) +
    ggtitle(paste0(label_x, " ~ ", label_y))
  print(p)

}

创建一个数据框,以便我们可以遍历每一行和每一列

var_y = c("mpg", "hp")
label_y = c("Miles per gallon [Mpg]", "Horse power [CV]")
var_x = c("cyl", "gear")
label_x = c("Cylinders [n]", "Gear [n]")

var_xy <- expand.grid(var_x, var_y, stringsAsFactors = FALSE)
label_xy <- expand.grid(label_x, label_y, stringsAsFactors = FALSE)
select_dat <- data.frame(var_xy, label_xy, stringsAsFactors = FALSE)
str(select_dat)

#> 'data.frame':    4 obs. of  4 variables:
#>  $ Var1  : chr  "cyl" "gear" "cyl" "gear"
#>  $ Var2  : chr  "mpg" "mpg" "hp" "hp"
#>  $ Var1.1: chr  "Cylinders [n]" "Gear [n]" "Cylinders [n]" "Gear [n]"
#>  $ Var2.1: chr  "Miles per gallon [Mpg]" "Miles per gallon [Mpg]" "Horse power [CV]" "Horse power [CV]"

将每一行传递给plot_scatter_with_label函数

pwalk(select_dat, ~ plot_scatter_with_label(mtcars, ..1, ..2, ..3, ..4))

#> [1] "character column names supplied, use rlang::sym()"

#> [1] "character column names supplied, use rlang::sym()"

#> [1] "character column names supplied, use rlang::sym()"

#> [1] "character column names supplied, use rlang::sym()"

reprex package (v0.2.1.9000) 于 2019-02-14 创建

【讨论】:

  • 太棒了!如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这将帮助可能遇到同样问题的未来读者。它也会给回答者和你自己带来一些声誉。没有义务这样做。
  • 我喜欢你的解决方案,我真的很喜欢这个例子。但是,我不确定如何将这些图保存或存储在图列表中,以便我可以选择需要显示的图。我猜问题是 plot_scatter_with_label() 中的 print(p) 强制打印所有图。但是,如果将其删除并调用 pwalk(select_dat, ~ plot_scatter_with_label(mtcars, ..1, ..2, ..3, ..4)) ,则不会显示任何图。如何按照相同的方法生成绘图列表而不是直接显示绘图?提前致谢
  • @JuanAntonioGonzálezSabaté:看这个例子stackoverflow.com/a/50930640/786542
猜你喜欢
  • 2020-08-20
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2016-02-13
  • 1970-01-01
  • 2020-02-21
相关资源
最近更新 更多