如何在ggplot2的geom_rect aes()中为fill和color分别设置不同alpha值
可行实现方案
报错原因说明:你之前在aes内直接调用
alpha(violation, .05)报错,是因为violation是分类变量而非颜色值,alpha()函数仅能对合法颜色值做透明度调整,无法直接作用于映射变量。
方案1:拆分颜色映射scale,分别设置透明度(推荐)
该方案无需修改原始数据,仅调整scale配置即可实现需求,核心逻辑是将原来同时作用于color和fill的scale拆分为两个独立scale,分别为fill和color的配色添加不同透明度:
library(ggplot2) library(dplyr) library(scales) # 用于处理颜色透明度 # 你原有基础颜色配置无需修改 viol.colors <- c("darkorange", "darkblue") names(viol.colors) = c("violation.mean", "violation.sd") # 预处理绘图数据(修正你原代码的管道符错误,原符号%应为%>%) plot_data <- groups %>% group_by(violation) %>% # 实际使用请确保你的数据包含sd字段,示例数据未提供该字段 select(violation, xmin, xmax, ymin, ymax, rect.color, sd) %>% unique() # 绘图核心代码 ggplot() + geom_rect(data = plot_data, aes(xmin = xmin - 0.75, xmax = xmax + 0.75, ymin = ymin - (sd * 0.15), ymax = ymax + (sd * 0.15), colour = violation, fill = violation), size = 0.25) + # 单独设置填充色scale,透明度为0.05 scale_fill_manual(values = alpha(viol.colors, 0.05)) + # 单独设置边框色scale,透明度为0.5 scale_color_manual(values = alpha(viol.colors, 0.5))
方案2:预生成带透明度的颜色列,直接映射
如果不想配置多个scale,可以提前在数据中生成对应透明度的颜色值,直接在aes中引用即可:
plot_data <- groups %>% group_by(violation) %>% select(violation, xmin, xmax, ymin, ymax, rect.color, sd) %>% unique() %>% # 提前预计算不同透明度的颜色值 mutate( fill_col = alpha(viol.colors[violation], 0.05), color_col = alpha(viol.colors[violation], 0.5) ) ggplot() + geom_rect(data = plot_data, aes(xmin = xmin - 0.75, xmax = xmax + 0.75, ymin = ymin - (sd * 0.15), ymax = ymax + (sd * 0.15), # I()表示直接使用传入的颜色值,不需要ggplot二次映射 fill = I(fill_col), colour = I(color_col)), size = 0.25)
内容的提问来源于stack exchange,提问作者reidj
相关产品推荐
相关产品推荐

