Я просто попытался использовать pivot_longer на 2D-матрице, чтобы получить «аккуратные» данные для ggplot. До сих пор это было довольно просто с reshape2::melt
library(tidyverse)
library(reshape2)
x <- c(1, 2, 3, 4)
y <- c(1, 2, 3)
Data <- matrix(round(rnorm(12, 10, 4)), nrow = 4, ncol = 3)
melt_data <- reshape2::melt(Data)
ggplot2::ggplot(meltvec, ggplot2::aes(x = Var1, y = Var2, fill = value)) +
geom_tile()
Однако pivot_longer нужен тиббл или data.frame. Итак, я придумал следующую функцию:
matrix_longer <- function(.data){
stopifnot(is.matrix(.data),
!is.data.frame(.data))
.data <- as.data.frame(.data)
names(.data) <- 1:ncol(.data)
.data$Var1 =1:nrow(.data)
pivot_longer(.data,cols = as.character( 1:(ncol(.data)-1)), names_to = "Var2", values_to = "value") %>%
arrange(Var2) %>%
mutate(Var2=as.numeric(Var2))
}
И он выдает тот же результат
own_data <- matrix_longer(Data)
ggplot2::ggplot(own_data, ggplot2::aes(x = Var1, y = Var2, fill = value)) +
geom_tile()
all(own_data==melt_data)
Вопрос: есть ли лучшее решение? Должен ли я / я просто придерживаться reshape2::melt
? Это плохая идея использовать .data
?