如何使用ggplot在单个管道流程中生成多张图并简化重复代码
ggplot重复绘图简化方案
方案1:长数据+分面(最推荐,代码最简)
如果可以接受三个图表放在同一张画布的不同分面中,只需要把原数据转换为长格式,一次性完成绘图:
library(tidyverse) smelly_cat %>% # 将三个y轴指标合并为长格式 pivot_longer( cols = c(cat_number, cat_size, cat_age), names_to = "指标名称", values_to = "指标数值" ) %>% ggplot(aes(x = wday, y = 指标数值)) + geom_bar(stat = "identity") + # 按指标分面,scales = "free_y"表示各分面使用独立y轴范围,不需要可以删掉 facet_wrap(~指标名称, scales = "free_y")
方案2:批量生成独立图表
如果需要三个完全独立的单图,可以用purrr::map遍历变量名批量生成ggplot对象列表:
library(tidyverse) # 定义需要作为y轴的变量列表 y_cols <- c("cat_number", "cat_size", "cat_age") # 批量生成图表,返回包含3个ggplot对象的列表 plot_list <- map(y_cols, function(col) { smelly_cat %>% ggplot(aes(x = wday, y = .data[[col]])) + geom_bar(stat = "identity") + labs(y = col) # 自动匹配y轴标签为对应变量名 }) # 需要使用某张图时直接按索引调取即可 # 第一张图(cat_number):plot_list[[1]] # 第二张图(cat_size):plot_list[[2]] # 第三张图(cat_age):plot_list[[3]]
注意:如果你原代码的
geom_bar()是用来做计数统计(不需要指定y参数),删掉上述代码中的y参数和stat = "identity"即可。
内容的提问来源于stack exchange,提问作者Junyi Yao
相关产品推荐
相关产品推荐

