R 在ggplot中循环变量

R 在ggplot中循环变量,r,for-loop,ggplot2,tidyeval,nse,R,For Loop,Ggplot2,Tidyeval,Nse,我想使用ggplot在多个列上循环以创建多个绘图,但是在for循环中使用占位符会更改ggplot的行为 如果我有这个: t <- data.frame(w = c(1, 2, 3, 4), x = c(23,45,23, 34), y = c(23,34,54, 23), z = c(23,12,54, 32)) 但这并不是: i <- 'x' ggplot(data=t, aes(w, i)) + geom_line() i您只需要使用aes\u string而不是aes,如

我想使用ggplot在多个列上循环以创建多个绘图,但是在for循环中使用占位符会更改ggplot的行为

如果我有这个:

t <- data.frame(w = c(1, 2, 3, 4), x = c(23,45,23, 34), 
y = c(23,34,54, 23), z = c(23,12,54, 32))
但这并不是:

i <- 'x'
ggplot(data=t, aes(w, i)) + geom_line()

i您只需要使用
aes\u string
而不是
aes
,如下所示:

ggplot(data=t, aes_string(x = "w", y = i)) + geom_line() 

请注意,
w
也需要指定为字符串。

问题在于如何访问数据帧
t
。您可能知道,有几种方法可以做到这一点,但不幸的是,在
ggplot
中使用字符显然不是其中之一


一种可行的方法是在您的示例中使用列的数字位置,例如,您可以尝试
i根据您尝试的操作,我发现
facet\u wrap
facet\u grid
可以很好地创建具有相同基本结构的多个图。像这样的事情应该会让你在正确的球场上:

t.m = melt(t, id="w")
ggplot(t.m, aes(w, value)) + facet_wrap(~ variable) + geom_line()
2018年7月发布,支持整洁的评估,如
(砰砰)内
aes()
。因此,我们可以做到以下几点:

  • 构建一个以x-&y列名作为输入的函数。注意使用
    rlang::sym

  • 然后使用
    purrr::map
    循环遍历每一列

库(rlang)
图书馆(tidyverse)
dt 4 x 34
#>5 1 y 23
#>6 2 y 34
#>7 3 y 54
#>8 4 y 23
#>9 1 z 23
#>10 2 z 12
#>11 3 z 54
#>12 4 z 32
###平面网格

ggp1我以前也使用过数字索引,这对于数据集中的每一列都非常有用。不过,每当我不得不假设t$x永远是t[,2]时,我都会感到紧张。太好了,谢谢。我相信我将来会需要这项工作。这不适用于更复杂的GGPlot(例如,那些使用刻面的)。@Gregor如果你问一个新问题,并用一个可复制的例子来说明这一点,我想有人可以帮你。在一般情况下,
aes_string()
方法(在Matt Parker的回答中)是有效的。我只是在评论,所以使用这个答案的人都知道它的局限性。一般来说,
ggplot2
更喜欢长格式的data.frames,即
m=melt(t,id=“w”);ggplot(子集(m,变量==“x”)、aes(w,值))+geom_line()
p另一个选项:
tmp <- data.frame(a = t[['w']], b = t[[i]])
ggplot(data=tmp, aes(a, b)) + geom_line()
t.m = melt(t, id="w")
ggplot(t.m, aes(w, value)) + facet_wrap(~ variable) + geom_line()