As cores do mapa de calor não funcionam em plotagem

Estou tentando imprimir uma grade de mapas de calor usando plotagem para R no Shiny. Quero dar a eles uma escala de cores personalizada, mas não está se comportando como eu quero. Quando eu uso ocolors = Quando construí meu gráfico de plotagem, parece usar a distribuição de valores, em vez do zmin e zmax que eu dei para atribuir cores.

No meu código de exemplo abaixo, você pode ver que eu atribuo a cada plotagem a mesma escala de cores (colorScale) usando a opção colors =. Isso funciona como eu espero quando tenho um conjunto de dados bem distribuído, como na primeira, segunda e quarta linha de plotagens.

No entanto, na terceira linha, onde os gráficos têm dados muito distorcidos, é possível ver que as escalas parecem diferentes de tudo o resto - elas têm o azul e o vermelho, mas pulam o branco no meio, em vez de roxo.

No meu código atual, isso está causando um grande problema para um gráfico que tem muitos valores no meio, com alguns extremos em ambos os lados - quero que esses valores no meio pareçam brancos, para mostrar que não houve alterações, mas, em vez disso, são roxos, dificultando a escolha dos valores importantes (os extremos).

Existe uma maneira de forçar a atribuição de cores a se comportar como eu quero?

Obrigado, Cliff

server.R

if (!require("pacman")) install.packages("pacman")

pacman::p_load(shiny,data.table,plotly)


colorScale <- colorRamp(c("darkblue","cornflowerblue","white","sandybrown","firebrick"))

nCodeNames <- c("a","b","c","d","e","f","g","h","i","j","k","l")
means = c(rnorm(600,0,2.5),runif(600,-5,5),runif(130,-4,-3.9),runif(70,4.5,5),rnorm(150,-3),rnorm(50,4),rnorm(180,-2.5),runif(20,4.93,4.98),runif(300,-4,3),rnorm(300,3.5))



dt <- data.table(age=rep(rep(c(11:20),times=20),times=12),composite=rep(rep(c(81:100),each=10),times=12),mean=means,n_code=rep(nCodeNames,each=200))

sub<-dt[n_code=="a"]

shinyServer(function(input, output) {

for(Ncode in nCodeNames){
  local({
    ncode = Ncode
    output[[paste0("grid",ncode)]] <- renderPlotly({
      sub <- dt[n_code == ncode]
      p <- plot_ly(data=sub, x=~age, y=~composite, z=~mean, type="heatmap", zmin=-5,zmax=5, 
                   colors = colorScale, colorbar=list(thickness="15"))%>%
           layout(title=ncode,xaxis=list(type="category",tickvals=c(11,15,20)),yaxis=list(title="",ticks=""))
    })
  })
}
})

ui.R

if (!require("pacman")) install.packages("pacman")

pacman::p_load(shiny, plotly)

nCodeNames <- c("a","b","c","d","e","f","g","h","i","j","k","l")


shinyUI(navbarPage(
  "E-N Matrics: Proportion of E-Code Resulting in each N-Code",

  tabPanel("Grid",

            lapply(c(1:4), function(i) fluidRow(
              lapply(c(1:3), function(j) column(4, plotlyOutput(paste0("grid",nCodeNames[(i-1)*3+j]))))
             ))

           #fluidRow(column(4,plotlyOutput(paste0("grid",nCodeNames[(1-1)*3+1]))),column(4,plotly))
  )
  ))

questionAnswers(1)

yourAnswerToTheQuestion