如何在R的plot_ly中为带timeline颜色映射的3D散点图添加指定索引的红色散点标记
解决plot_ly添加红色标记点时的颜色映射冲突问题
这个错误的原因很清晰:当你在初始的plot_ly()调用中设置了color=timeline,plotly会默认让后续添加的trace继承这个颜色映射配置。但你新增的trace只有3个数据点,而原来的timeline长度是219,tibble不允许这种长度不匹配的列组合,所以就抛出了这个大小兼容错误。
这里有个简单直接的解决方案:在add_trace()里添加inherit = FALSE参数,让新的trace不继承初始trace的颜色映射设置,同时保留你想要的红色标记配置。
修正后的完整代码如下:
library(plotly) index <- c(80, 150, 195) set.seed(4991) data1 <- rnorm(219,9,1.5) data2 <- rnorm(219,2,1) timeline <- 1:length(data1) # 生成带timeline颜色映射的3D散点图 plot_ly(x=data1, y=data2, z=timeline, type="scatter3d", mode="markers", color=timeline) %>% layout(scene = list( xaxis = list(title = 'cases per day'), yaxis = list(title = 'deaths per day'), zaxis = list(title = 'observation #') )) %>% # 添加指定索引的红色标记点,禁用继承避免颜色映射冲突 add_trace( x=data1[index], y=data2[index], z=timeline[index], type="scatter3d", mode = "markers", marker = list(size = 5, color = "red", symbol = 104), inherit = FALSE # 关键参数:不继承初始trace的颜色设置 )
运行这段代码后,你会得到预期的效果:
- 主散点图按照
timeline的数值呈现渐变颜色映射 - 指定索引(80、150、195)的三个点会以红色、特定符号的样式突出显示
另外还有一种替代思路:在add_trace()里用color = I("red")(I()函数可以强制plotly把值当成固定颜色,而非映射变量),配合inherit=FALSE也能实现同样效果,不过上面的方法已经足够简洁高效了。
内容的提问来源于stack exchange,提问作者Arnoneel Sinha
相关产品推荐
相关产品推荐

