2015-07-25 1 views
0

У меня есть следующие данные (пример), который я хочу построить: matrix(c("Variable1",0.4,0.5,"string1","Variable2",0.3, "string2","string3","Variable3"),ncol=3)Создать квадратичную матрицу с меньшим треугольником, как тепловые карты и данные символов верхнего треугольника

Я хочу создать тепловые карты с номерами 0.4,0.5,0.3 матрицы и использовать нижний треугольные:

numeric<- matrix(c(1,0.4,0.5,0.4,1,0.3,0.5,0.3,1),ncol=3) 
    require(graphics) 
    require(grDevices) 
    library(colorRamps) 

    library(lattice) 
    x <- seq(pi/4, 5*pi, length.out=10) 
    y <- seq(pi/4, 5*pi, length.out=10) 
    grid <- expand.grid(X=x, Y=y) 

    myPanel <- function(x, y, z, ...) { 
    panel.levelplot(x,y,z,...) 
    panel.text(x, y, round(z,2),cex=0.578,...)} 
    levelplot(numeric,panel=myPanel) 

на верхнем треугольнике включительно по диагонали тепловой карты, я хочу иметь символы со значениями "string1", "string2", "string3", "Variable1", "Variable2", "Variable3" на одной и той же позиции сетки, как и в данной матрице!

Я подумал о создании сетки и использовании функции графического пакета image() для цветных чисел, но это не работает для меня.

У вас есть простая и элегантная функция, где вам просто нужна данная матрица в качестве входных данных?

ответ

0

Вы можете попробовать ComplexHeatmap пакет, с помощью которого вы можете самостоятельно определить тело Heatmap:

Сначала создать матрицу Symmetrix:

set.seed(123) 
mat = matrix(rnorm(100), 10) 
colnames(mat) = letters[1:10] 

mat2 = cor(mat) 

Make кластеризацию и корректировать заказы для обеих строк и столбцов:

od = hclust(dist(mat2))$order 
mat2 = mat2[od, od] 

Теперь мы можем самостоятельно определить тепловую карту. В следующем коде col управляет отображением значений в цвета. Поскольку кластеризация уже применяется, мы устанавливаем cluster_rows и cluster_columns в FALSE. Когда type настроен на none в gpar(), то горячая карта инициализируется, но ничего не добавляется, , тогда мы можем использовать самоопределяемую функцию cell_fun, чтобы добавить в нее графику.

cell_fun будет применен к каждой маленькой сетке в тепловой карте. В cell_fun, есть семь аргументов:

  • j: индекс столбца в mat2
  • i: индекс строки в mat2
  • x: положение на участке
  • y: положение на участке
  • w: ширина текущей сетки
  • h: высота текущей сетки
  • col: заполненном цвета для текущей сетки

Использования Heatmap() для создания окончательного Heatmap:

Heatmap(mat2, col = colorRamp2(c(-1, 0, 1), c("green", "white", "red")), 
    cluster_rows = FALSE, cluster_columns = FALSE, 
    heatmap_legend_title = "cor", rect_gp = gpar(type = "none"), 
    cell_fun = function(j, i, x, y, w, h, col) { 
     if(i > j) { 
      grid.rect(x, y, w, h, gp = gpar(fill = col)) 
     } else if(j == i) { 
      grid.text(labels[i], x, y) 
     } else { 
      grid.text(sprintf("%.2f", mat2[i, j]), x, y) 
     } 
     grid.rect(x, y, w, h, gp = gpar(fill = NA, col = "black")) 
    }) 

enter image description here

+0

Почему мы должны кластер корреляционная матрица? – Novice

+0

И ваша функция heatmap также позволяет изменять графические параметры par (pin = ..., ps = ... =) только для верхнего треугольника? Например: я хочу создать панель пар, которая имеет на нижнем треугольнике тепловую карту (со значением корреляции), а на верхнем треугольнике какая-то специальная функция создает контурные графики с парами (..., panel =). Эта специальная функция контурного графика автоматически маркирует контурные линии с указанием высоты. Я могу избежать этой маркировки, используя par (pin = 0, ps = c (0,0)), но размер корреляционных значений на нижней панели также исчезает. PS: Мне нравится карта тепла на Гитубе. – Novice

+0

кластеризация используется только для сопоставления взаимосвязанных элементов друг с другом. –