R 的 Plotly 4.x 中的颜色

colors in Plotly 4.x for R

我将新的 Plotly (4.x) 包用于带有 Shiny 的 R。我正在分类地为我的图表着色,如果一个类别中只有 1 个项目,则着色退出并出现错误。一个最小的例子如下:

plot_ly(head(iris, 1), 
   x = ~Sepal.Length, y = ~Sepal.Width, color=~Species,      
   colors = setNames("#FF5748", "setosa"),
   type = "scatter", mode = "markers")

Error in if (has_attr(x$type, "colorscale")) x[["z"]] else NULL : argument is of length zero

colors向量是我命名的向量,其中名称指的是物种并选择了适当的颜色,如果每个物种存在多个项目,则总是正确的,例如:

plot_ly(iris[c(1,60),], 
    x=~Sepal.Length, y=~Sepal.Width, color=~Species, 
    colors=setNames(c("#FF5748", "black"), c("setosa", "versicolor")),
    type="scatter", mode="markers")

这是一个严重的错误还是我遗漏了什么?

谢谢!

编辑:更准确地说,这个问题经常发生在生成子图并且子图只有1个数据点时:

colormap <- setNames(c("#FF5748", "black"), c("setosa", "versicolor"))
data <- iris[c(1,2,60), ]

# vars contains the facet variables
vars <- levels(factor(data$Species))

# build a list of length(var) plots
plots <- lapply(vars, function(species) {
  data <- subset(data, Species==species)
  plot_ly(data, x=~Sepal.Length, y=~Sepal.Width) %>%
    add_bars(color=~Species, colors=colormap) 
})

p <- subplot(plots, nrows = length(plots), shareX = TRUE, titleX = FALSE)

此代码产生错误,而使用 color = factor(data$Species) 工作正常。谢谢 dww!

我可以确认重现这个问题。它发生在

  1. 数据只有一行,
  2. 并将 color = 参数传递给 plot_lyadd_trace
  3. 并且用于颜色的列具有不存在的因子水平

我们可以看到需要这些条件中的第 3 个来重现问题,因为这会产生错误:

pdata = head(iris, 1)
plot_ly(pdata, x = ~Sepal.Length, y = ~Sepal.Width,
          color = pdata$Species,
          colors = setNames("#FF5748", "setosa"),
          type = "scatter", mode = "markers")

但这不是:

plot_ly(pdata, x = ~Sepal.Length, y = ~Sepal.Width, 
         color = factor(pdata$Species),      
         colors = setNames("#FF5748", "setosa"),
         type = "scatter", mode = "markers")

这看起来像是一个错误。目前,您可以使用上面重构颜色列的第二个结构来回避这个问题。请注意,您需要使用 $ 表示法而不是 ~ 来引用该列。

更新

错误现已在最新的 github 提交中修复 https://github.com/ropensci/plotly/commit/724b440578f954593e9d6ce555bca8b143fc9e6d