Plotly存在NA值时error_y误差值被分配到错误y值的修复问题
问题原因
该错位问题的根源是Plotly的R接口在解析error_y参数的公式输入时,会自动丢弃向量中的NA值,导致误差值的索引和y轴点位的索引无法对齐:y轴会保留NA点位(仅不渲染,占用索引位置),而误差值的NA被删除后,剩余的误差值会依次匹配前面的y轴点位,最终出现错位。
你之前尝试用na.omit()处理误差向量的方案,本质是主动删除误差值的NA,进一步放大了索引长度的差异,只会导致更严重的错位。
修复方案
方案1:拆分双trace绘制(最稳妥,无兼容性问题)
将普通点位渲染和误差棒渲染拆分到两个trace中,误差棒仅使用无缺失的数据集绘制,保证误差值和点位1:1匹配,同时保留原x轴的分类水平,所有年份都会正常显示:
library(plotly) library(tidyverse) reprex <- tibble(year = as_factor(c(2013, 2014, 2015, 2016, 2017, 2018, 2019)), rate = c(3, 2, NA, NA, 0.153, 0.123, NA), lcl = c(2, 1, NA, NA, 0.0813, 0.0612, NA), ucl = c(4, 5, NA, NA, 0.261, 0.219, NA)) %>% mutate(difflow = rate-lcl, diffhi = ucl-rate) # 过滤非缺失数据用于绘制误差棒 reprex_non_na <- filter(reprex, !is.na(rate)) plot <- plot_ly() %>% # 第一个trace渲染所有点位和连线,保证缺失位置留空、x轴显示全量年份 add_trace(data = reprex, x = ~year, y = ~rate, mode = 'markers+lines', type = "scatter", connectgaps = F, showlegend = F) %>% # 第二个trace仅渲染误差棒,点位和误差值完全匹配无错位 add_trace(data = reprex_non_na, x = ~year, y = ~rate, mode = 'none', type = "scatter", error_y = ~list(type = "data", array = diffhi, arrayminus = difflow, color = "black"), showlegend = F) plot
方案2:AsIs强制保留误差向量的NA位置(代码更简洁)
用I()函数包裹误差向量,告诉Plotly不要自动过滤NA值,保持误差向量和y向量的长度、索引完全一致:
plot <- plot_ly() %>% add_trace(data = reprex, connectgaps = F, x = ~year, y = ~rate, mode = 'markers+lines', type = "scatter", error_y = list(type = "data", array = I(reprex$ucl - reprex$rate), arrayminus = I(reprex$rate - reprex$lcl), color = "black"))
内容的提问来源于stack exchange,提问作者Trevor C
相关产品推荐
相关产品推荐

