如何在sapply生成的ggplot分图中设置多条竖线的颜色与线型
ggplot2多子图自定义垂直线样式解决方案
你可以通过以下两种方式实现每条垂直线独立设置颜色、线型、粗细:
方法1:调整循环逻辑适配多参数
保留原有循环思路,改用mapply同时传入线位置和对应样式参数:
library(gridExtra) library(grid) library(lattice) library(ggplot2) library(dplyr) # 统一配置垂直线参数,顺序一一对应 vertical.lines <- c(1990,1991) line_lty <- c(3,1) line_color <- c("blue","red") line_lwd <- c(0.5,0.5) df1 %>% filter(isocode == "KOR") %>% select(year,rgdpe, rgdpo, avh, emp, hc) %>% tidyr::gather(predictor, value, -year)%>% ggplot() + geom_line(aes(year, value))+ facet_wrap(~predictor, scales = "free")+ labs(x = NULL, y = NULL, top = "Title of the Chart", bottom = textGrob( "Data source: World Bank", gp = gpar(fontface = 3, fontsize = 9), hjust = 1,x = 1)) + # mapply逐组传入参数生成对应样式的垂直线 mapply(function(xint, lt, col, lw) geom_vline(xintercept = xint, lty = lt, color = col, lwd = lw), vertical.lines, line_lty, line_color, line_lwd)
方法2:数据框管理垂直线参数(更推荐)
把垂直线的所有参数整合到独立数据框中,通过映射实现样式自定义,后续增删线、调整参数更便捷:
library(gridExtra) library(grid) library(lattice) library(ggplot2) library(dplyr) # 构建垂直线参数表,每条线对应一行 vline_df <- data.frame( xint = c(1990, 1991), lty = c(3, 1), color = c("blue", "red"), lwd = c(0.5, 0.5) ) df1 %>% filter(isocode == "KOR") %>% select(year,rgdpe, rgdpo, avh, emp, hc) %>% tidyr::gather(predictor, value, -year)%>% ggplot() + geom_line(aes(year, value))+ # 直接使用参数表中的配置,无需映射避免生成多余图例 geom_vline(data = vline_df, aes(xintercept = xint), linetype = vline_df$lty, color = vline_df$color, linewidth = vline_df$lwd)+ facet_wrap(~predictor, scales = "free")+ labs(x = NULL, y = NULL, top = "Title of the Chart", bottom = textGrob( "Data source: World Bank", gp = gpar(fontface = 3, fontsize = 9), hjust = 1,x = 1))
补充说明
- 如果需要为垂直线生成图例,可将
linetype/color/linewidth参数放入aes()内,配合scale_*_manual()系列函数自定义图例样式即可 - 两种方法均适配任意数量的垂直线,只需对应补充参数列表/参数表行即可
内容的提问来源于stack exchange,提问作者jck21
相关产品推荐
相关产品推荐

