R语言for循环,救救孩子,请问大佬们为什么两次结果不一样?
题主的问题其他回答已经有高手解答过了,那个我就做一些补充回答吧
ggplot2支持自定义图层函数,因此咱们有更加方便的方式来添加多图层,而不用通过显式循环
传统方法添加多图层
library(tidyverse)
# 题主似乎没有提供原始表格,这里就随便构建一个用于绘图的表格
text1 <- economics %>% select(date,unemploy) %>% mutate(x=as.numeric(date),y1=unemploy, y2=1.3*y1, y3 = 1.3*y2) %>% filter(x>0,x<5000)
# 传统方法添加多图层
text1 %>% ggplot() +
geom_line(aes(x=x,y=y1), color="red") +
geom_line(aes(x=x,y=y2), color="blue") +
geom_line(aes(x=x,y=y3), color="orange")
通过列表的方式添加图层
- ggplot2允许定义一个函数,这个的返回值是一个列表,列表中的每个元素就是你想添加的图层
# 定义列表函数
textFunc <- function() {
list(
geom_line(aes(x=x,y=y1), color="red"),
geom_line(aes(x=x,y=y2), color="blue"),
geom_line(aes(x=x,y=y3), color="orange")
)
}
# 将该函数作为图层加到ggplot后
text1 %>% ggplot() +
textFunc()
# 其实就等价于下面这个形式
text1 %>% ggplot() + list(
geom_line(aes(x=x,y=y1), color="red"),
geom_line(aes(x=x,y=y2), color="blue"),
geom_line(aes(x=x,y=y3), color="orange")
)
# 注:成图效果同上,故此处省略
构建批量添加图层的通用函数
- 知道了批量添加的规则,那么我们只要构造这么一个列表就行了
# 此处构建列表的方式只是一个例子,如果有更简便的方式也可以
textLoopFunc <- function(yList) {
map2(.x = yList,.y = c("red","blue","orange"),~geom_line(aes(x=x,y=.data[[.x]]), color=.y))
}
text1 %>% ggplot() +
textLoopFunc(yList=c("y1","y2","y3"))
# 注:成图效果同上,故此处省略