在R中使用colnames()在循环中改变地块的标题。

问题描述 投票:0回答:1

我正在创建一个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 = ...) +
             ...)
}

非常感谢你

r for-loop ggplot2 title
1个回答
2
投票

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)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.