R语言使用for循环批量绘制ggplot折线图出现空白图问题
问题原因
你出现空白图的核心原因是ggplot2的美学映射aes()对变量的解析逻辑问题:当你在循环中写y = v时,aes()不会把v作为存储了列名字符串的变量处理,而是直接尝试读取数据集里名为v的列,你的closing_price数据集不存在该列,因此没有绘图数据,最终输出空白图。
解决方法
要让aes()正确识别v存储的字符串对应的列,有两种常用修正方案:
方案1:使用.data代词(最简洁,推荐)
直接用.data[[v]]指代当前数据集里v对应的列,修改后的循环代码如下:
library(tidyverse) library(glue) var = list("CAH", "CTLT","CI","DVA","HSIC","HOLX","HUM","IDXX","INCY","MRK","REGN","VTRS") for(v in var){ p<-closing_price %>% mutate(date = as.Date(Date,"%m/%d/%y")) %>% ggplot(aes(x = date, y = .data[[v]], group=1)) + geom_line() + labs(x = "日期", y = "股价(美元)", title = glue("{v} 价格走势")) + scale_x_date(date_minor_breaks = "2 day") print(p) }
方案2:使用非标准评估语法
先将字符串v转为符号,再用!!注入到美学映射中:
library(tidyverse) library(glue) library(rlang) var = list("CAH", "CTLT","CI","DVA","HSIC","HOLX","HUM","IDXX","INCY","MRK","REGN","VTRS") for(v in var){ col_sym <- sym(v) p<-closing_price %>% mutate(date = as.Date(Date,"%m/%d/%y")) %>% ggplot(aes(x = date, y = !!col_sym, group=1)) + geom_line() + labs(x = "日期", y = "股价(美元)", title = glue("{v} 价格走势")) + scale_x_date(date_minor_breaks = "2 day") print(p) }
两种方案都可以正常通过for循环一次性绘制多张折线图,你原来的代码只是没有处理aes()的变量解析规则,不存在其他逻辑问题。
内容的提问来源于stack exchange,提问作者the_curious_programmer
相关产品推荐
相关产品推荐

