2017-04-19 36 views
0

我的代碼是下面,但我想有白色映射到0,而不是data_bydate $ avg_score如何強制地圖零到白色R中plotly色標

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)) 
的最大值和最小值的中間值

眼下它不給一個圖,其中高於零個值是綠色的,低於零個值是紅色的......

回答

1

你可以創建自己的colorscale從紅色(分鐘)變爲白色(零)變綠(最大)。 colorscale是由兩個獨立的顏色標度組成的數組列表,其中一個用於零以下的部分,從紅色到白色,另一個用於從白色到綠色。

enter image description here

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') 
+0

的感謝!有用! – user7891984