如何在 R 绘图色标中强制将零映射到白色

use*_*984 3 r graph colors plotly

我的代码如下,但我希望将白色映射到 0,而不是 data_bydate$avg_score 的最大值和最小值的中间值

g <- plot_ly(data_bydate, x = ~Date, y = ~avg_score, color =data_bydate$avg_score, colors = c("#FF0000","#FFFFFF", "#008000"), mode ='markers', marker = list(size=3)) %>%
layout(legend = list(orientation = 'h'), 
       xaxis = list(title = "",
                    zeroline = FALSE,
                    tickformat="%X",
                    showline = TRUE), 
       yaxis = list(title = "",
                    zeroline = FALSE,
                    showline = TRUE ))
Run Code Online (Sandbox Code Playgroud)

现在它没有给出一个图表,其中零以上的值是绿色的,零以下的值是红色的......

Max*_*ers 7

您可以创建自己的colorscale颜色,从红色(最小)到白色(零)再到绿色(最大)。这colorscale是一个数组列表,由两个单独的色标组成,一个用于低于零的部分,从红色到白色,另一个用于上面的部分,从白色到绿色。

在此输入图像描述

library(plotly)
library(scales)

set.seed(42)
colorlength <- 100

data_bydate <- data.frame(Date = c(1:23),
                          avg_score = c(runif(10, -5, -1), 
                                        rep(0,3), 
                                        runif(10, 1, 10)
                                        )
                          )

null_value <- (0 - min(data_bydate$avg_score)) / (max(data_bydate$avg_score) - min(data_bydate$avg_score))        
border <- as.integer(null_value * colorlength)
colorscale <- as.list(1:colorlength)

#colorscale below zero
s <- scales::seq_gradient_pal("#FF0000", "#FFFFFF", "Lab")(seq(0,1,length.out=border))
for (i in 1:border) {
    colorscale[[i]] <- c((i - 1) / colorlength, s[i])
}

#colorscale above zero
s <- scales::seq_gradient_pal("#FFFFFF", "#008000", "Lab")(seq(0,1,length.out=colorlength - border))
for (i in 1:(colorlength - border)) {
  colorscale[[i + border]] <- c((i + border) / colorlength, s[i])
}

plot_ly(data_bydate, 
        x = ~Date, 
        y = ~avg_score, 
        type = 'scatter',
        mode ='markers', 
        marker = list(size = 10,
                      color = ~avg_score,
                      colorscale = colorscale,
                      colorbar = list(len=1))) %>%
  layout(plot_bgcolor = 'black')
Run Code Online (Sandbox Code Playgroud)