ggplot2中alpha透明度参数仅对部分条形生效问题求助
问题描述
我有如下示例数据:
data <- structure(list(Binomial = c("Herpestes auropunctatus", "Herpestes auropunctatus", "Martes martes", "Martes martes", "Mustela erminea", "Mustela erminea", "Mustela putorius", "Mustela putorius", "Neovison vison", "Neovison vison" ), Introduction = c("Successful", "Unsuccessful", "Successful", "Unsuccessful", "Successful", "Unsuccessful", "Successful", "Unsuccessful", "Successful", "Unsuccessful"), Values = c(7, 1, 1, 0, 3, 1, 4, 0, 112, 9)), row.names = c(NA, 10L), class = "data.frame")
想要绘制堆叠水平条形图并设置条形透明度为0.6,尝试了以下代码:
p <- data %>% mutate(Binomial = factor(Binomial, levels = sel_order$Binomial, ordered = T)) %>% ggplot(aes(y = reorder(Binomial, Values), x = Values, fill = factor(Introduction)), group = Binomial) + geom_bar(position = "stack", stat = "identity") + geom_col(width = .6) + scale_fill_manual(values = alpha(c("#74D055FF","#E55C30FF"), .6)) + labs(title = "Points of introductions", fill = "Introduction") + xlab("Number of points") + ylab("Species") + theme(title = element_text(size = 20, face = "bold"), axis.line = element_line(), axis.text.x = element_text(size = 15, colour = "black"), axis.text.y = element_text(size = 13, face = "italic", colour="black"), axis.ticks.y = element_line(), axis.title = element_text(size = 18, face = "bold"), axis.ticks = element_line(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), legend.text = element_text(size = 16), legend.title = element_text(size = 18), plot.title = element_text(hjust = 0.5))
但alpha参数仅对部分条形生效,尝试将alpha放在ggplot的aes中、geom_bar或geom_col参数中均无效。环境为Windows 10 x64系统,R 4.2.2版本。
解决方案
问题出在你同时使用了geom_bar()和geom_col()——这两个图层是重复绘制的,geom_col()本质就是stat="identity"的geom_bar(),叠加后导致部分条形被重复渲染,透明度表现异常。
修正步骤:
- 移除重复的
geom_bar()图层,只保留geom_col()即可; - 将
alpha参数直接放在geom_col()中,这样所有条形都会应用统一的透明度;或者继续使用scale_fill_manual()结合alpha(),但要确保没有重复图层。
修正后的代码示例:
# 假设sel_order是你已定义的排序数据框 p <- data %>% mutate(Binomial = factor(Binomial, levels = sel_order$Binomial, ordered = TRUE)) %>% ggplot(aes(y = reorder(Binomial, Values), x = Values, fill = factor(Introduction))) + # 只保留geom_col,添加alpha参数 geom_col(position = "stack", width = .6, alpha = 0.6) + scale_fill_manual(values = c("#74D055FF","#E55C30FF")) + labs(title = "Points of introductions", fill = "Introduction") + xlab("Number of points") + ylab("Species") + theme(title = element_text(size = 20, face = "bold"), axis.line = element_line(), axis.text.x = element_text(size = 15, colour = "black"), axis.text.y = element_text(size = 13, face = "italic", colour="black"), axis.ticks.y = element_line(), axis.title = element_text(size = 18, face = "bold"), axis.ticks = element_line(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), legend.text = element_text(size = 16), legend.title = element_text(size = 18), plot.title = element_text(hjust = 0.5))
这样修改后,所有堆叠条形都会呈现统一的0.6透明度,不会出现部分生效的问题。
内容的提问来源于stack exchange,提问作者LT17
相关产品推荐
相关产品推荐

