You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(),叠加后导致部分条形被重复渲染,透明度表现异常。

修正步骤:

  1. 移除重复的geom_bar()图层,只保留geom_col()即可;
  2. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:02:45