如何在ggplot2中为指定分组条形图添加同色条纹?
解决ggplot2条形图条纹不显示的问题
你的代码无法显示条纹,核心原因是原生ggplot2的geom_bar不支持pattern参数,需要借助ggpattern包来实现填充图案效果。以下是修复后的完整代码:
# 安装并加载ggpattern包(首次运行需要安装) # install.packages("ggpattern") library(ggpattern) library(ggplot2) # 数据整理优化:新增站点分组,让颜色映射更清晰 sites <- c("Mt. Grace", "Mt. Grace Hardwood", "White's Pond", "White's Pond Hardwood", "TriMountain", "TriMountain Hardwood") nitr_rates <- c(-0.90855, -0.7161, -0.46017, -0.30943, -0.21913, 0.2995) # 新增主站点分组,用于颜色映射 site_group <- c("Mt. Grace", "Mt. Grace", "White's Pond", "White's Pond", "TriMountain", "TriMountain") striped_sites <- c("Mt. Grace Hardwood", "White's Pond Hardwood", "TriMountain Hardwood") # 将Stripe列的NA替换为"none",避免pattern映射异常 Stripe <- ifelse(sites %in% striped_sites, "stripe", "none") Nitri_data <- data.frame(sites, nitr_rates, site_group, Stripe) site_order <- c("Mt. Grace", "Mt. Grace Hardwood", "White's Pond", "White's Pond Hardwood", "TriMountain", "TriMountain Hardwood") # 绘图代码 ggplot(Nitri_data, aes(x = factor(sites, levels = site_order), y = nitr_rates)) + # 用geom_bar_pattern替换geom_bar,支持pattern参数 geom_bar_pattern( stat = "identity", color = "black", alpha = 0.7, aes(fill = site_group, pattern = Stripe), # 调整条纹的粗细、密度等样式 pattern_color = "black", pattern_fill = "black", pattern_density = 0.1, pattern_spacing = 0.02 ) + # 设置填充颜色 scale_fill_manual(values = c("Mt. Grace" = "#5BA300", "White's Pond" = "#0073E6", "TriMountain" = "#B51963")) + # 设置图案:仅Hardwood站点显示条纹,其余无图案 scale_pattern_manual(values = c("stripe" = "stripe", "none" = "none")) + xlab("Site") + ylab("mg N/g dry wt. soil/28 days") + ggtitle("Net Nitrification") + theme_minimal() + theme(legend.position = "bottom")
关键改动说明:
- 引入
ggpattern包:这是实现ggplot2填充图案的核心工具,提供了支持pattern参数的几何对象 - 替换
geom_bar为geom_bar_pattern:该函数原生支持图案填充 - 优化数据结构:新增
site_group列,让颜色映射逻辑更清晰,避免直接用颜色值作为映射变量 - 修正
Stripe列:将NA替换为"none",确保所有观测都有明确的pattern映射值 - 调整图案样式参数:通过
pattern_color、pattern_density等参数可以自定义条纹的颜色、密度和间距
内容的提问来源于stack exchange,提问作者Kynareth
相关产品推荐
相关产品推荐

