首页 > 解决方案 > 如何使用最小代码ggplot2 / R从数据帧的不同变量中绘制不同图形中的变化图

问题描述

我想知道包或另一个包中是否有一个函数ggplot2或一个for循环方式R来从数据帧的各种变量/列创建不同的图图,而不需要对每个变量进行编码,每个变量的每个图。例如,如果我有一个名为 df 的数据框,其中包含几列:(id数据键)、v1v2、 ...、v10。我想在 Y 轴和X 轴上绘制各种变量 ( v2to ) ,但不对每个变量重复相同的代码。v8v1

# For 1 plot, how could I code for various plots?    
plot_v2 <- df %>% # (plot_name as column name, i.e plot_v2)
  ggplot( aes(x=v1, y=v2, group=id, color=id)) +
    geom_line()

这段代码创建了一个带有绘图的图形,我想知道一种方法来对 Y 轴上的所有变量执行此操作,每个变量v2都有v8一个新图形。

这只是一个理论问题,任何关于要查看的函数或编写 for 循环的方法的建议或提示都会非常有帮助。我无法提供任何样本数据。我曾尝试使用 for 循环,但是当我必须指定轴的变量aes()名称以及绘图对象的名称时会出现一些问题。非常感谢任何帮助!

因为我的第一篇询问这个疑问的帖子碰巧被关闭了,我会说清楚,我不想在同一个绘图/图形中绘制所有变量,我想知道如何为每个变量创建一个新图形。就像在 Matlab 中一样,它每次都会使用 figure() 函数并遍历表的列。

标签: rggplot2

解决方案


让我们定义一个示例数据框

df <- data.frame(
  v1 = runif(40, min = 0, max = 20), 
  v2 = runif(40, min = -10, max = 10),
  v3 = runif(40, min = -30, max = 40),
  v4 = runif(40, min = -30, max = 40),
  v5 = runif(40, min = -30, max = 40),
  v6 = runif(40, min = -30, max = 40),
  v7 = runif(40, min = -30, max = 40),
  v8 = runif(40, min = -30, max = 40),
  id = rep(c("a", "b", "c", "d"), each = 10)
)

我们可以定义一个函数,该函数将索引和数据框作为输入,并根据传递的索引生成图

# to change the selected columns, edit `[[i + 1]]`
make_plot <- function(i, df) {
  df %>% 
    ggplot(aes(x = v1, y = .[[i + 1]], color = id)) +
    geom_line()
}

最后,我们通过调用 lapply 函数来表示图

lapply(1:7, make_plot, df)

推荐阅读