r - 热图颜色在绘图中不起作用

标签 r shiny heatmap plotly

我正在尝试使用 Shiny 中的 R 绘图来打印热图网格。我想给他们一个自定义的色阶,但它的行为并不像我想要的那样。当我在构建绘图图表时使用 colors= 选项时,它似乎使用值的分布,而不是我给它分配颜色的 zmin 和 zmax。

在下面的示例代码中,您可以看到我使用 color= 选项为每个图指定了相同的色阶 (colorScale)。当我有一组分布良好的数据时,如第一、第二和第四行图所示,这符合我的预期。

但是,在第三行中,图的数据非常倾斜,您可以看到刻度看起来与其他所有刻度不同 - 它们有蓝色和红色,但跳过中间的白色,而是紫色。

在我的实际代码中,这对图表造成了一个大问题,该图表中间有很多值,两端都有一些极端 - 我希望中间的这些值显示为白色,以表明存在没有变化,但它们是紫色的,使得挑选出重要值(极端值)变得更加困难。

有没有办法强制颜色分配按照我想要的方式运行?

谢谢, 悬崖

服务器.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))
  )
  ))

最佳答案

我在 R 绘图热图中的色阶遇到了类似的问题。当 z 参数的数据具有螺旋分布时,绘图仅使用色标中指定的几种颜色。

我找到了一个解决方案,根据原始变量的分位数创建一个新变量,并将其传递给 z 参数。这是总体思路的 R 代码。您需要对其进行自定义以使其能够解决特定问题。

library(plotly)
library(RColorBrewer)

# create a dataframe where z has a skewed distribution
set.seed(1)
df = data.frame(x = rep(1:50, 20) , y = rep(1:20,each =50), z = rgamma(1000, 2, 0.5))

# check distribution of z 
plot_ly(data = df, x = ~z, type = "histogram")%>% 
    layout(title = "histogram of z")  

# original heatmap
# pass the column z with screwed distribution to z argument
plot_ly(data=df, x=~x, y=~y, z=~z, type="heatmap",  
        colors = "Spectral") %>% 
    layout(title = "original heatmap")

# some data processing work 

# find unique quantiles of z 
quantiles = unique(quantile(df$z, seq(0,1,0.1)))

# create a dummy column z1 of discrete values using the quantiles as cut off
# the ideas is to arrage the data to subgroups of roughly the same size 
df$z1= cut(df$z, breaks =  c(quantiles[1]-1,quantiles[-1]), right = TRUE, labels = FALSE)

# check distribution of z1 
plot_ly(data = df, x = ~z1, type = "histogram")%>% 
    layout(title = "histogram of z1")


# new heatmap 
# passes the new column z1 to z argument 
plot_ly(data=df, x=~x, y=~y, z=~z1, type="heatmap",  
        # make sure hovering over displays original z
        text =~z, hoverinfo = "text", 
        # use the color palettes from RColorBrewer, 
        # or your customized colorscale
        colors = "Spectral",  
        # map the label of the colorbar back to the quantiles
        colorbar=list(tickmode="array", tickvals = 1:(length(quantiles)-1), ticktext = round(quantiles,2)[-1], title = "z")) %>% 
layout(title = "new heat map")

下面是原始热图和plotly生成的新热图。新的热图使用“光谱”调色板中的更多颜色来区分较小的值。

enter image description here

希望这有帮助!

<小时/>

2017年4月3日更新

我在 Rplotly 存储库上提出了一个请求,要求能够转换色标。

https://github.com/ropensci/plotly/issues/920

关于r - 热图颜色在绘图中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40535371/

相关文章:

r - 无需绘图即可扩展轴范围(以便按 x 单位对齐两个图)

r - 数据表 : apply different formatStyle to each column

java - 相当于Clojure中的imshow?

r - 使用 rCharts 在 r 和shiny中创建传单热图

r - 根据hcharter中的给定序列设置热图颜色范围

sql - 根据其他行中列的值选择行

r - R中If else循环中的错误

r - 如何将茎叶图输出为图

javascript - 在 Shiny 中自动滚动按钮点击

r - ggplot 的 Shiny 切割顶部