2016-09-24 1 views
0

은 같은, 고장이 발생수정 plotly 컬러 스케일 내가 plotly의 R 인터페이스를 사용하여 히트 맵을 만든

df <- data.frame(date = rep(seq(ymd('2016-09-01'), ymd('2016-09-10'), by='day'), each=2), 
       period = rep(c('lunch', 'dinner'), times=10), 
       diff=rnorm(20)) 

df %>% 
    plot_ly(x = date, 
      y = period, 
      z = abs(diff), 
      type = "heatmap", 
      hoverinfo='none', 
      colors = rev(RColorBrewer::brewer.pal(5, "RdYlGn")), 
      showscale = F) %>% 
    add_trace(x = date, 
      y = period, 
      text = paste0(round(diff*100), '%'), 
      mode='text', 
      hoverinfo='none') 

:

heatmap

내가 휴식을 해결할 수있는 방법이 있나요 컬러 스케일의? 나는 컬러 스케일의 중간 점을 20 %로하고 50 %를 초과하는 값은 스케일의 끝에 빨간색으로 채색하고 싶습니다.

답변

2

히트 맵은 일반적으로 요소의 값에 따라 색상이 달라 지지만 일반적으로 원하는 기준에 따라 각 요소를 5 개의 그룹 중 하나로 그룹화하고 그에 따라 5 가지 색상을 지정할 수 있습니다. 그런 다음 해당 그룹을 z로 전달합니다.

# create 5 levels or groups for the diff variable 
# choose breaks as desired 
diffLevel <- cut(abs(df$diff), 
       breaks = c(0, 0.0625, .125, .3, .5, Inf)) 

df %>% 
    plot_ly(x = date, 
      y = period, 
      z = as.integer(diffLevel), 
      type = "heatmap", 
      hoverinfo='none', 
      colors = rev(RColorBrewer::brewer.pal(5, "RdYlGn")), 
      showscale = F) %>% 
    add_trace(x = date, 
      y = period, 
      text = paste0(round(diff*100), '%'), 
      mode='text', 
      hoverinfo='none') 

또 다른 방법은 0.5 (그리고 zauto = FALSE)에 zmax 값을 설정하는 것입니다 : 당신은 정수로 그룹을 변환 할 수 있도록 Z는 아니지만 요소 수 있어야한다. 이것은 반드시 colorscale의 중심을 .2로 설정하지는 않지만, 꽤 잘 작동하고 0.5 이상의 컷오프를 설정합니다. 위의 값은 모두 빨간색입니다. 그것은 또한 당신이 직접 abs(diff)에 전달할 수 있습니다 :

df %>% 
    plot_ly(x = date, 
      y = period, 
      z = abs(diff), 
      zauto = FALSE, # set this to FALSE! 
      zmax = 0.5,    
      type = "heatmap", 
      hoverinfo='none', 
      colors = rev(RColorBrewer::brewer.pal(5, "RdYlGn")), 
      showscale = F) %>% 
    add_trace(x = date, 
      y = period, 
      text = paste0(round(diff*100), '%'), 
      mode='text', 
      hoverinfo='none') 

마지막으로 방법은 사용자 정의 colorscale와 함께 작동하는 것입니다. 나는이 형식을 사용하여 colorscale 인수를 얻는 것이 까다로울 수 있음을 발견했습니다. 이 작업을 수행하는 더 좋은 방법이있을 수 있지만 우아한 무엇이든지 만들 수는 없었습니다.

customPalette <- colorRampPalette(c("red", "yellow", "green"))(61) 
# I put 30 values between 0 and .2 and and 30 between .2 and 1. 
# And so, my palette has 61 colors 
customColors <- setNames(
    data.frame(breaks = c(seq(0, .2, length.out = 31), seq(.21, 1, length.out = 30)), 
      colors = as.character(
       apply(col2rgb(rev(customPalette)), 2, function(ii) 
       paste("rgb(", paste(ii, collapse = ","),")", sep = ""))), 
      stringsAsFactors = FALSE), 
    NULL) 
# not perfect, but it seems to work decently 

# initialize a list 
colList <- list() 
colList[[dim(customColors)[1]]] <- 0 

# format custom color list 
for(i in seq_len(dim(customColors)[1])) { 
    colList[[i]] <- c(customColors[i, 1], customColors[i, 2]) 
} 

# set zmax = 0.5 and zauto = FALSE 
df %>% 
    plot_ly(x = date, 
      y = period, 
      z = abs(diff), 
      zauto = FALSE, 
      zmax = 0.5, 
      type = "heatmap", 
      hoverinfo='none', 
      colorscale = colList, 
      showscale = F) %>% 
    add_trace(x = date, 
      y = period, 
      text = paste0(round(diff*100), '%'), 
      mode='text', 
      hoverinfo='none')