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!
我可以确认重现这个问题。它发生在
- 数据只有一行,
- 并将
color =
参数传递给 plot_ly
或 add_trace
。
- 并且用于颜色的列具有不存在的因子水平
我们可以看到需要这些条件中的第 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
我将新的 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!
我可以确认重现这个问题。它发生在
- 数据只有一行,
- 并将
color =
参数传递给plot_ly
或add_trace
。 - 并且用于颜色的列具有不存在的因子水平
我们可以看到需要这些条件中的第 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