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

如何在ggplot2的geom_point中单独设置填充与轮廓透明度?

实现ggplot2散点图实心轮廓+半透明填充(兼容ggplotly)

核心思路

使用shape=21的点时,colour参数控制轮廓颜色,fill参数控制填充颜色,通过给填充色添加alpha通道,就能独立实现轮廓实心、填充半透明的效果——轮廓色保持alpha=1(不透明),填充色设置小于1的alpha值即可。


1. 基础ggplot2实现

先准备示例数据:

set.seed(123)
df <- data.frame(
  x = rnorm(100),
  y = rnorm(100),
  group = sample(c("A", "B"), 100, replace = TRUE)
)

方式1:直接指定颜色与透明度

library(ggplot2)

ggplot(df, aes(x = x, y = y)) +
  geom_point(
    shape = 21,
    size = 3,
    colour = "black", # 实心黑色轮廓
    fill = scales::alpha("steelblue", 0.3) # 半透明蓝色填充
  ) +
  theme_minimal()

方式2:按分组映射颜色

如果需要按分组区分颜色,用scale_colour_manual和scale_fill_manual分别设置实心轮廓色和半透明填充色:

ggplot(df, aes(x = x, y = y, colour = group, fill = group)) +
  geom_point(shape = 21, size = 3) +
  # 分组实心轮廓色
  scale_colour_manual(values = c("A" = "#E63946", "B" = "#457B9D")) +
  # 分组半透明填充色(alpha=0.3)
  scale_fill_manual(values = c(
    "A" = scales::alpha("#E63946", 0.3),
    "B" = scales::alpha("#457B9D", 0.3)
  )) +
  theme_minimal()

2. 兼容ggplotly的版本

如果需要保留hover文本的灵活性,上述ggplot代码直接转换为ggplotly即可,效果完全保留:

library(plotly)

# 先构建带hover文本的ggplot对象
p <- ggplot(df, aes(
  x = x, y = y, 
  colour = group, fill = group,
  # 自定义hover内容
  text = paste(
    "分组:", group, "\n",
    "X值:", round(x, 2), "\n",
    "Y值:", round(y, 2)
  )
)) +
  geom_point(shape = 21, size = 3) +
  scale_colour_manual(values = c("A" = "#E63946", "B" = "#457B9D")) +
  scale_fill_manual(values = c(
    "A" = scales::alpha("#E63946", 0.3),
    "B" = scales::alpha("#457B9D", 0.3)
  )) +
  theme_minimal()

# 转换为ggplotly,指定hover显示自定义文本
ggplotly(p, tooltip = "text")

3. plot_ly原生实现参考

你提到plot_ly默认支持该效果,以下是对应参考代码:

plot_ly(df, x = ~x, y = ~y, color = ~group) %>%
  add_markers(
    marker = list(
      size = 10,
      # 填充半透明
      opacity = 0.3,
      # 实心轮廓(宽度设为2保证清晰)
      line = list(
        color = ~ifelse(group == "A", "#E63946", "#457B9D"),
        width = 2
      )
    ),
    # 自定义hover文本
    text = ~paste(
      "分组:", group, "\n",
      "X值:", round(x, 2), "\n",
      "Y值:", round(y, 2)
    ),
    hoverinfo = "text"
  ) %>%
  layout(plot_bgcolor = "#f8f8f8")

内容的提问来源于stack exchange,提问作者Phenomniverse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:17:31