循环遍历ggplot中的变量
我想使用 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))
这工作正常:
ggplot(data=t, aes(w, x)) + geom_line()
但这不行:
i <- 'x'
ggplot(data=t, aes(w, i)) + geom_line()
如果我想最终循环 x、y 和 z,这就是一个问题。 有什么帮助吗?
I want to use ggplot to loop over several columns to create multiple plots, but using the placeholder in the for loop changes the behavior of ggplot.
If I have this:
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))
This works fine:
ggplot(data=t, aes(w, x)) + geom_line()
But this does not:
i <- 'x'
ggplot(data=t, aes(w, i)) + geom_line()
Which is a problem if I want to eventually loop over x, y and z.
Any help?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您只需使用
aes_string
而不是aes
,如下所示:请注意,
w
也需要指定为字符串。You just need to use
aes_string
instead ofaes
, like this:Note that
w
then needs to be specified as a string, too.ggplot2 > 3.0.0
支持整洁的评估代词。数据
。因此我们可以执行以下操作:构建一个采用 x- & 的函数y- 列名称作为输入。请注意
.data[[]]
的使用。然后使用
purrr::map
循环遍历每一列。定义一个接受字符串作为输入的
函数 循环遍历每一列
编辑:上面的函数也可以写成 w/
rlang::sym
&!!
(砰砰)。或者我们可以使用
facet_grid
/facet_wrap
< /a> 将数据帧从宽格式转换为长格式后 (tidyr::gather
)ggplot2 > 3.0.0
supports tidy evaluation pronoun.data
. So we can do the following:Build a function that takes x- & y- column names as inputs. Note the use of
.data[[]]
.Then loop through every column using
purrr::map
.Define a function that accept strings as input
Loop through every column
Edit: the above function can also be written w/
rlang::sym
&!!
(bang bang).Or we can just use
facet_grid
/facet_wrap
after convert the data frame from wide to long format (tidyr::gather
)问题在于如何访问数据框
t
。您可能知道,有多种方法可以做到这一点,但不幸的是,使用字符显然不是 ggplot 中的其中一种。一种可行的方法是使用示例中列的数字位置,例如,您可以尝试
i <- 2
。然而,如果这个工作依赖于我从未使用过的 ggplot(但我知道 Hadley 的其他工作,我想它应该可以工作),另一种规避方法是在每次调用 ggplot 时创建一个新的临时数据框。例如:
The problem is how you access the data frame
t
. As you probably know, there are several ways of doing so but unfortunately using a character is obviously not one of them inggplot
.One way that could work is using the numerical position of the column in your example, e.g., you could try
i <- 2
. However, if this works rests on ggplot which I have never used (but I know other work by Hadley and I guess it should work)Another way of circumventing this is by creating a new temporary data frame every time you call ggplot. e.g.:
aes_string() 在 ggplot2 中已弃用 > 3.0.0,但可以使用.data[[]]。这个答案的灵感来自于 Matt 和 Tung 的答案。
ggplot(data=t, aes(x = w, y = .data[[i]])) + geom_line()
aes_string() was deprecated in ggplot2 > 3.0.0 but .data[[]] can be used. This answer was inspired from the answers from Matt and Tung.
ggplot(data=t, aes(x = w, y = .data[[i]])) + geom_line()
根据您想要执行的操作,我发现
facet_wrap
或facet_grid
可以很好地创建具有相同基本结构的多个绘图。像这样的事情应该让你处于正确的位置:Depending on what you are trying to do, I find
facet_wrap
orfacet_grid
to work well for creating multiple plots with the same basic structure. Something like this should get you in the right ballpark: