我想使用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。有什么帮助吗?
5条答案
按热度按时间gcxthw6b1#
你只需要使用
aes_string
而不是aes
,就像这样:请注意,
w
也需要指定为字符串。mjqavswn2#
ggplot2 > 3.0.0
支持整洁的求值代词.data
。我们可以这样做:.data[[]]
的使用。purrr::map
循环遍历每一列。定义一个接受字符串作为输入的函数
循环遍历每列
编辑:上述函数也可以写成w/
rlang::sym
&!!
(bang bang)。或者,我们可以在将 Dataframe 从宽格式转换为长格式(
tidyr::gather
)后使用facet_grid
/facet_wrap
。qfe3c7zg3#
问题是如何访问 Dataframe
t
。您可能知道,有几种方法可以做到这一点,但不幸的是,在ggplot
中使用字符显然不是其中之一。一种可行的方法是在示例中使用列的数字位置,例如,您可以尝试
i <- 2
。然而,如果这个作品依赖于我从未使用过的ggplot(但我知道哈德利的其他作品,我猜它应该会起作用)另一种方法是在每次调用ggplot时创建一个新的临时 Dataframe 。例如:
8fsztsew4#
根据您尝试做的事情,我发现
facet_wrap
或facet_grid
可以很好地创建具有相同基本结构的多个图。像这样的东西应该让你在正确的球场:tyg4sfes5#
aes_string()在ggplot 2> 3.0.0中被弃用,但可以使用.data。这个答案的灵感来自Matt和Tung的答案。
ggplot(data=t, aes(x = w, y = .data[[i]])) + geom_line()