2016-11-10 9 views
3

ShinyのRのプロットを使ってヒートマップのグリッドを印刷しようとしています。私は彼らにカスタムカラースケールを与えたいと思っていますが、私はそれをしたいとは思えません。私がプロットチャートを作成するときにcolors =オプションを使用すると、色を割り当てるために与えたzminとzmaxではなく、値の分布が使われているようです。ヒートマップの色がプロットしていません

私の例のコードでは、colors =オプションを使用して各プロットに同じcolorscale(colorScale)を与えることがわかります。これは、第1行、第2行、第4行のプロットのように、よく分散されたデータセットを持っているときに、私が期待する方法で動作します。

ただし、プロットのデータが非常に歪んでいる3行目では、縮尺が他のすべてのものと異なって見えることがあります。青と赤がありますが、中央の白をスキップします。

私の実際のコードでは、中央付近に大きな値があり、両端にいくつかの極端な値があるグラフの場合、大きな問題が発生しています。中間にある値を白で表示したい変更はありませんでしたが、代わりに紫色で、重要な値(極端な値)を選ぶのが難しくなりました。

カラーアサインメントを強制的に動作させる方法はありますか?

私はRでColorScaleのplotlyヒートマップと同様の問題に遭遇したおかげで、 クリフ

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)) 
) 
)) 

答えて

3

。 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") 

以下はオリジナルのヒートマップとプロットされた新しいヒートマップです。新しいヒートマップは、「スペクトル」パレットのより多くの色を使用して、より小さな値を区別します。

enter image description here

は、この情報がお役に立てば幸い! 4月3,2017


アップデートは、私はカラースケールを変換する機能のためのplotlyリポジトリRへのリクエストをオープンしました。

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

関連する問題