我可以使用
colors
参数为我的 plotly
图表提供调色板,如下所示:
library(plotly)
library(viridis)
col_pal <- viridis(10)
plot_ly(mtcars) %>%
add_trace(x = ~ mpg, y = ~ cyl, color = ~ factor(cyl), colors = col_pal,
type = "scatter", mode = "markers", marker = list(size = 25))
使用以下
JavaScript
我可以确定有效使用哪些颜色:
const cols = $('path.point').map(function() {
const style = $(this).attr('style');
const fill_col = style.match(/fill: [^;]+/g)[0].replace('fill: ', '');
const hex = '#' + fill_col
.slice(4, -1)
.split(',')
.map(x => (+x).toString(16).padStart(2, 0))
.join('');
return hex;
})
new Set(cols)
// Set(3) {'#440154', '#25908c', '#fde725'}
如果我将其与
col_pal
进行比较:
col_pal
# [1] "#440154FF" "#482878FF" "#3E4A89FF" "#31688EFF" "#26828EFF" "#1F9E89FF"
# [7] "#35B779FF" "#6DCD59FF" "#B4DE2CFF" "#FDE725FF"
我看到
plotly
使用第一个和最后一个元素 (#440154FF
/ #FDE725FF
),并且第三种颜色似乎是某种插值,因为它不是 col_pal
的直接成员:
scales::show_col(c(col_pal[1:5], "#25908CFF", col_pal[6:10]))
我猜颜色是
col_pal[5:6]
的插值
但我不知道颜色是如何计算的?任何想法如何复制颜色
plotly
在 R 中使用知道:
nlevels(as.factor(mtcars$cyl))
)P.S.:如果我的调色板包含一个中间点,则颜色完全匹配(更改
col_pal <- viridis(11)
,使用的颜色是col_pal[c(1, 6, 11)]
。但是,我对 oclor 调色板长度和所需颜色的任何组合非常感兴趣。
经过一些调试后,我确定了完成颜色映射的行(实际上已经在 R 侧):
colScale <- scales::col_factor(pal, levels = names(pal) %||% lvls, na.color = na.color)
因此要准确获取 plotly
使用的颜色,我们需要运行:
lvls <- levels(as.factor(mtcars$cyl))
scales::col_factor(col_pal, levels = lvls)(lvls)
# [1] "#440154" "#25908C" "#FDE725"