plotly / plotly/plotly.R

Unexpected attribute mapping with missing values in x/y

未关闭
#1,815 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
R
星标
2.7k
派生
641
PR 合并指标
30 天内没有已合并 PR

描述

Dear devs,

it seems like NA values in x/y values (i.e. mapped to coordinates) cause issues (or unexpected behavior) with mapping of other attributes, in this case opacity. I assume this is in-line with #1126.
The attribute seems to be recycled across groups, or only mapped to a single group, depending on how the argument was supplied (referenced as higher and lower level mapping in code).
I was able to reproduce the problem with the code below. Note, that the attribute vector is generated as a column of the data.frame used for plotting.

Cheers!

library(plotly)

n <- 100

# generate test data set with grouping factor z for color
# and index (used for customdata in event_data())
# in shiny
testdat <- data.frame(x = seq_len(n),
                      y = rnorm(n),
                      yy = rnorm(n),
                      z = gl(5, 20),
                      .index = seq_len(n))

# generate attribute vector for opacity
# based on .index (active selection in shiny)
testdat$.opacity <- ifelse(testdat$.index %in% 5:14, 0.9, 0.1)

# assign missing values
testdat$yy[15:19] <- NA

# mapping vector
colvector <- c('1' = "black",
               '2' = "red",
               '3' = "darkorange",
               '4' = "steelblue",
               '5' = "seagreen4")

# "lower level" mapping ---------------------------------------------------

# works as expected
plot_ly(data = testdat) %>% 
    add_markers(type = "scatter",
                x = ~x,
                y = ~y,
                color = ~as.factor(z),
                colors = colvector,
                customdata = ~.index,
                marker = list(opacity = ~.opacity))

# when missing values are present on y-value
# seems to recycle attributes after first group
plot_ly(data = testdat) %>% 
    add_markers(type = "scatter",
                x = ~x,
                y = ~yy,
                color = ~as.factor(z),
                colors = colvector,
                customdata = ~.index,
                marker = list(opacity = ~.opacity))



# "higher level" mapping --------------------------------------------------



# when attribute is mapped at "higher level"
# first "z group" is given opacity attribute,
# but not others
plot_ly(data = testdat) %>% 
    add_markers(type = "scatter",
                x = ~x,
                y = ~y,
                color = ~as.factor(z),
                colors = colvector,
                customdata = ~.index,
                opacity =  ~.opacity)

# when attribute is mapped at "higher level"
# and missing values present,
# opacity not mapped at all
plot_ly(data = testdat) %>% 
    add_markers(type = "scatter",
                x = ~x,
                y = ~yy,
                color = ~as.factor(z),
                colors = colvector,
                customdata = ~.index,
                opacity = ~.opacity)


Session Info:

> sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plotly_4.9.2       ggplot2_3.3.0.9000

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.4.6      pillar_1.4.4      compiler_3.6.3    later_1.0.0       tools_3.6.3       digest_0.6.25     jsonlite_1.6.1   
 [8] lifecycle_0.2.0   tibble_3.0.1      gtable_0.3.0      viridisLite_0.3.0 pkgconfig_2.0.3   rlang_0.4.6       shiny_1.4.0      
[15] rstudioapi_0.11   crosstalk_1.0.0   yaml_2.2.1        fastmap_1.0.1     withr_2.2.0       dplyr_0.8.5       httr_1.4.1       
[22] vctrs_0.2.4       htmlwidgets_1.5.1 grid_3.6.3        tidyselect_1.0.0  glue_1.4.0        data.table_1.12.8 R6_2.4.1         
[29] farver_2.0.3      purrr_0.3.4       tidyr_1.0.2       magrittr_1.5      scales_1.1.0      promises_1.1.0    ellipsis_0.3.0   
[36] htmltools_0.4.0   assertthat_0.2.1  xtable_1.8-4      mime_0.9          colorspace_1.4-1  httpuv_1.5.2      lazyeval_0.2.2   
[43] munsell_0.5.0     crayon_1.3.4     

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先使用 plotly.R 运行所提供的 R 复现代码,比较使用 y 和 yy 的情况,以及较低层级和较高层级的 opacity 映射。跟踪缺失的 y 值和分组 trace 如何影响属性向量,然后验证 opacity 仍与相应的观测值和组保持对齐。

由索引模型根据 Issue 内容生成。

评估

技术栈
r
领域
data-visualization
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。