使用lapply批量生成ggplot折线图时geom_hline和ggtitle报错如何解决
问题解答
错误原因
ggplot2的aes()美学映射默认采用非标准评估逻辑,直接传入字符串格式的列名时,会被识别为字面量,不会匹配数据框中对应名称的列。你在函数中写y=column时,ggplot会固定查找数据框中名为column的列,而非column变量存储的实际列名。- R的
$运算符不支持动态解析变量名,excess_return$column会直接查找名为column的列,不会读取column变量中存储的列名字符串,因此geom_hline无法正确计算均值。 - 你第一次调用
lapply(excess_return[,1:10], plot_data_column)时,迭代传入的是每一列的数值向量,没有携带列名信息,因此ggtitle也无法正确展示列名。
修复方案
你可以使用tidyverse官方推荐的.data代词实现动态列引用,同时使用双括号[[ ]]替代$实现动态列取值,修改后的代码如下:
自定义函数修改
plot_data_column = function (col_name) { ggplot(data = excess_return, aes(y = .data[[col_name]], x = date)) + geom_line() + geom_hline(yintercept = mean(excess_return[[col_name]], na.rm = TRUE), color = "red") + ggtitle(col_name) + theme_minimal() }
注:额外添加
na.rm = TRUE是为了避免数据存在缺失值时均值计算报错,不需要可以删除。
调用方式
直接传入列名向量即可:
ggplots = lapply(colnames(excess_return[,1:10]), plot_data_column)
运行后ggplots列表中每个元素就是对应XS1到XS10的绘图对象,直接打印对应索引即可查看图片。
内容的提问来源于stack exchange,提问作者Amirgiano
相关产品推荐
相关产品推荐

