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)
现在它没有给出一个图表,其中零以上的值是绿色的,零以下的值是红色的......
您可以创建自己的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)