Флип-карта для ggplot2

Код ниже генерирует тепловую карту, идущую снизу слева вверху справа

library(ggplot2)
library(reshape2)
set.seed(111)

n <- 10
m <- matrix(rnorm(n^2), n, n)
m <- cor(m)
m <- melt(m)

ggplot(m, aes(Var1, Var2, fill = value)) + 
    geom_tile()

Как я могу изменить свои данные (возможно, изменить результат плавления), чтобы тепловая карта шла сверху вниз слева направо, для такого результата

2 ответа

Решение

Ужасное решение по сравнению с @Axeman'ом (но более забавное) - применить к данным матрицу ротационного преобразования.

Чтобы понять, какое преобразование нам нужно, я нанес только диагональные (значение =1) точки на трехмерной диаграмме рассеяния.

Вращательная матрица вокруг оси z (значение)

Включая добавленную константу, окончательное уравнение

Возможно, есть лучший способ векторизовать это преобразование, но я так и сделал.

rot_m <- matrix(c(0,-1,0,1,0,0,0,0,1),3,3)

ftransform <- function(x){
   t(rot_m %*% as.numeric(matrix(m[x,],3,1)) + matrix(c(0,11,0),3,1))
 }

foo <- lapply(1:nrow(m),ftransform)

foo <- data.frame(do.call(rbind,foo))
names(foo) <- c("Var1","Var2","value")
ggplot(foo, aes(Var1,Var2,fill=value)) + 
   geom_tile()

РЕДАКТИРОВАТЬ: Извинения за странный формат изображения / макет.

Это работает для меня

      ggplot(m, aes(aes(reorder(Var1, desc(Var1)), Var2, fill = value)) + 
    geom_tile()

график результатов

Другие вопросы по тегам