Центрирование цвета около 0 с RColorBrewer - PullRequest
0 голосов
/ 17 мая 2018

Итак, я хочу визуализировать матрицу с такими цветами, как этот

library(RColorBrewer)
vec = rbinom(10000,1,0.1)
n = sum(vec)
vec = ifelse(vec == 1, rnorm(n), 0)
mat = matrix(vec,100,100)
image(t(mat)[,nrow(mat):1],
      col=brewer.pal(8,"RdBu"),
      xaxt= "n", yaxt= "n", frame.plot=T,
      useRaster = TRUE
)

, что дает мне график

Example plot

НоЯ хочу, чтобы цвета были "сосредоточены вокруг 0".Под этим я подразумеваю, что я хочу, чтобы нулевое значение было белым, а положительное / отрицательное значения - красным / синим (или синим / красным это не имеет значения).Есть идеи, если это возможно?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

В качестве альтернативы heatmap2, вы можете использовать pheatmap:

library(pheatmap)
pheatmap(mat,
         color = brewer.pal(7,"RdBu"),
         border_color = NA,
         cluster_rows = FALSE,
         cluster_cols = FALSE)

Вы также можете скрыть легенду, если хотите, с помощью legend = FALSE, что даст результат, аналогичный вашему вызову с изображением, но с белым значением 0.

0 голосов
/ 18 мая 2018

Вот решение без каких-либо дополнительных пакетов.В вашем коде вы не присваивали значения из переменной vec ни одной из восьми цветовых корзин.Вам нужно разрезать массив vec на восемь ячеек, а затем назначить каждому бину свой цвет и затем построить график:

library(RColorBrewer)
vec = rbinom(10000,1,0.1)
n = sum(vec)
vec = ifelse(vec == 1, rnorm(n), 0)
mat = matrix(vec,100,100)

#cut the original data into 9 groups
cutcol<-cut(vec, 9)
#Create color palette with white as the center color
colorpal<-brewer.pal(8,"RdBu")
colorpal<-c(colorpal[1:4], "#FFFFFF", colorpal[5:8])

#assign the data to the 9 color groups
color<-colorpal[cutcol]
#create the color matrix to match the original data
colormat<-matrix(color,100,100)

#plot with the assigned colors
image(t(mat)[,nrow(mat):1],
      col=colormat,
      xaxt= "n", yaxt= "n", frame.plot=T,
      useRaster = TRUE
)

#check color assignment
#hist(vec)
#hist(as.numeric(cutcol), breaks=8)

enter image description here

0 голосов
/ 17 мая 2018

Функция bluered в пакете gplots делает это. Вы можете сделать свою цветовую палитру как:

library(gplots) # not to be confused with `ggplot2`, which is a very different package
color_palette <- bluered(9) # change the number to adjust how many shades of blue/red you have.  Even numbers will assign white to two bins in the middle.

Чтобы выровнять их по центру, вы можете использовать функцию heatmap.2, также в gplots - просто не делайте кластеризацию:

heatmap.2(mat,
  Rowv = FALSE,
  Colv = FALSE, 
  dendrogram = 'none',
  trace = 'none',
  col = bluered, # this can take a function
  symbreaks = TRUE, # this is the key  value for symmetric breaks
)

Чтобы придерживаться функции image, вам необходимо вручную установить разрывы. Следующий код получит это для вас:

pos_breaks <- quantile(abs(mat), probs = seq(0, 1, length.out = 5))
centered_breaks <- c(rev(-pos_breaks[-1]), pos_breaks)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...