如何在R的Plotly 3D散点图中实现部分类别点透明显示?
解决方案
不用拆分多个轨迹,有两种简便方法实现需求:
方法一:给目标类别颜色添加透明度通道
Plotly支持带透明度的十六进制颜色(格式为#RRGGBBAA,最后两位是透明度,00全透明,FF完全不透明)。我们可以先把自定义颜色和品牌一一对应,再给指定品牌的颜色加上透明度:
mtcars$brand <- sapply(strsplit(rownames(mtcars), " "), "[[", 1) mtcars$brand <- as.factor(mtcars$brand) # 创建品牌-颜色的命名向量,确保颜色和品牌对应准确 brand_colors <- setNames( c("#ebac23", "#b80058", "#008cf9", "#006e00", "#00bbad", "#d163e6", "#b24502", "#ff9287", "#5954d6", "#00c6f8", "#878500", "#00a76c", "#bdbdbd", "#846b54", "#5F2F87", "#241346", "#B3EE3A", "#077187", "#FFE06A", "#73787E", "#A6CEE3", "#1F78B4"), levels(mtcars$brand) ) # 给Cadillac和Ferrari的颜色添加透明度(这里用40表示半透明,可调整) brand_colors[c("Cadillac", "Ferrari")] <- paste0(brand_colors[c("Cadillac", "Ferrari")], "40") fig <- plot_ly(mtcars, x = ~wt, y = ~hp, z = ~qsec, color = ~brand, colors = brand_colors, type = "scatter3d", mode = "markers") fig
方法二:单独设置透明度列
新增一列控制每个点的透明度,再映射到Plotly的opacity参数:
mtcars$brand <- sapply(strsplit(rownames(mtcars), " "), "[[", 1) mtcars$brand <- as.factor(mtcars$brand) custom_colors <- c("#ebac23", "#b80058", "#008cf9", "#006e00", "#00bbad", "#d163e6", "#b24502", "#ff9287", "#5954d6", "#00c6f8", "#878500", "#00a76c", "#bdbdbd", "#846b54", "#5F2F87", "#241346", "#B3EE3A", "#077187", "#FFE06A", "#73787E", "#A6CEE3", "#1F78B4") # 新增opacity列:Cadillac和Ferrari设为0.2(透明),其余为1(不透明) mtcars$opacity <- ifelse(mtcars$brand %in% c("Cadillac", "Ferrari"), 0.2, 1) fig <- plot_ly(mtcars, x = ~wt, y = ~hp, z = ~qsec, color = ~brand, colors = custom_colors, opacity = ~opacity, # 映射透明度列 type = "scatter3d", mode = "markers") fig
说明
- 方法一的好处是颜色和透明度绑定在一起,图例里的颜色也会显示对应透明度;
- 方法二更灵活,能单独调整透明度数值,不影响颜色本身。
两种方法都只需要一次绘制,不用逐个添加轨迹,完美解决你的需求。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

