【问题标题】:Custom discrete color scale in plotly绘图中的自定义离散色阶
【发布时间】:2025-12-17 11:45:01
【问题描述】:

我想自定义 plotly 图中的颜色。根据docs,这适用于连续变量和尺度:

library(plotly)

plot_ly(iris, x = Petal.Length, y = Petal.Width,
             color = Sepal.Length, colors = c("#132B43", "#56B1F7"),
             mode = "markers")

但是,如果我将参数设置为离散颜色(字符或因子),这仍然有效,但会引发警告:

> plot_ly(iris, x = Petal.Length, y = Petal.Width,
          color = Sepal.Length>6, colors = c("#132B43", "#56B1F7"),
          mode = "markers")


Warning message:
In RColorBrewer::brewer.pal(N, "Set2") :
  minimal value for n is 3, returning requested palette with 3 different levels

我该如何正确地做到这一点?

【问题讨论】:

    标签: r plotly


    【解决方案1】:

    这不是情节问题,而是 ColorBrewer(以及相关的 RColorBrewer 包)的设计功能。您会注意到,当您将 color 分配给等于或超过三个级别的因素时,警告会消失,例如

    plot_ly(iris, x = Petal.Length, y = Petal.Width,
            color = cut(Sepal.Length, 3), colors = "Set1",
            mode = "markers")
    

    这是因为 ColorBrewer 的最小数据类数是三个(您可以从 http://colorbrewer2.org/ 中看到,其中不能选择少于三个类)。比如?brewer.pal(plotly引用的函数)中,它具体说

    所有顺序调色板都有 3 种变体 不同的值多达 9 个不同的值。

    [...]

    对于定性调色板,可用的不同值的最小数量始终是 3

    由于build_plotly()(函数plotly()在内部调用)总是调用brewer.pal()(见第474行here),如果不重写build_plotly()函数以不调用brewer.pal()就不可能解决这个问题少于 3 个数据类。

    同时,要关闭警告,请将绘图输出分配给一个对象并将print(object) 语句包装在suppressWarnings() 中,如下所示:

    plotly_plot <- plot_ly(iris, x = Petal.Length, y = Petal.Width,
          color = Sepal.Length>6, colors = c("#132B43", "#56B1F7"),
          mode = "markers")
    
    suppressWarnings(print(plotly_plot))
    

    【讨论】:

    • 有道理。提交了一个错误报告:github.com/ropensci/plotly/issues/670
    • 在此期间我有什么办法可以摆脱这个警告?我试过压制它,但似乎在错误的地方压制它,因为它仍然显示。我还尝试在因子中添加一个未使用的第三级。但这似乎也不起作用。