R语言for循环,救救孩子,请问大佬们为什么两次结果不一样?

发布时间:
2024-08-12 00:21
阅读量:
28

题主的问题其他回答已经有高手解答过了,那个我就做一些补充回答吧

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")) # 注:成图效果同上,故此处省略

该通用图层函数的信息

END