【问题标题】:Changing title of plots in a loop with colnames() in R在 R 中使用 colnames() 更改循环中的绘图标题
【发布时间】:2020-09-02 18:19:52
【问题描述】:

我正在创建一个 for 循环,它为数据框中的前六列中的每一列创建一个 ggplot2 图。除了标题名称的循环之外,一切正常。我一直在尝试使用title = colnames(df[,i])title = paste0(colnames(df[,i]) 创建正确的标题,但它最终只是重复了第二列名称。图表本身为每一列正确生成数据,但标题由于某种原因没有循环。对于第一个图,它会生成正确的标题,但对于第二个图及之后的图,它只会继续重复第三列名称,完全跳过第二列名称。我什至尝试在循环中创建一个变量来存储相应的标题名称,然后在 ggplot2 标题标签中使用:changetitle <- colnames(df[,i]),然后使用title = changetitle,但这也会错误地循环。

这是我目前所拥有的一个例子:

plot_6 <- list()

for(i in df[1:6]){
   plot_6[i] <- print(ggplot(df, aes(x = i, ...) ...) +
             ... +
             labs(title = colnames(df[,i]),
                  x = ...) +
             ...)
}

非常感谢。

【问题讨论】:

  • 尝试将colnames(df[,i]) 更改为colnames(df)[i]
  • 啊,我试过这个,但不幸的是没有改变任何东西。

标签: r for-loop ggplot2 title


【解决方案1】:

df[1:6] 是一个有六列的数据框。当用作循环变量时,这将导致i 成为每次循环中的值向量。从 ggplot 将产生一个绘图的意义上说,这可能“有效”,但它破坏了提供给 ggplot 的数据框(在本例中为df)和df 的列与 ggplot 美学的映射之间的联系。

这里有几个选项,使用内置的mtcars 数据框:

library(tidyverse)
library(patchwork)

plot_6 <- list()

for(i in 1:6) {

  var = names(mtcars)[i]

  plot_6[[i]] <- ggplot(mtcars, aes(x = !!sym(var))) +
    geom_density() +
    labs(title = var)
}

# Use column names directly as loop variable
for(i in names(mtcars)[1:6]) {

  plot_6[[i]] <- ggplot(mtcars, aes(x = !!sym(i))) +
    geom_density() +
    labs(title = var)
}

# Use map, which directly generates a list of plots
plot_6 = map(names(mtcars)[1:6],
    ~ggplot(mtcars, aes(x = !!sym(.x))) +
      geom_density() +
      labs(title = .x)
)

其中任何一个都会产生相同的图列表:

wrap_plots(plot_6)

【讨论】:

  • 谢谢,这成功了! [[i]] 和 !!sym(var) 到底是做什么的?
猜你喜欢
  • 1970-01-01
  • 2013-04-24
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多