我正在尝试使用 ggplot2 创建一个热图,但我注意到当我绘制它时,它似乎将矩阵向左旋转 90 度。很奇怪,用coord_flip()
和 t()
不起作用,因为他们将其向左旋转,而不是向右旋转(因此,他们没有进行校正,而是创建了一个旋转 180 度的热图)。是否有任何选择或技巧可以防止这种情况发生?这是相关的代码:
#this is needed to run custHeat
zeroInterval <- function(mat, colors){
#modified version of findInterval such that zero is given its own category
#This function takes intervals as left exclusive, right inclusive.
#This is mostly so that intervals consisting of a single value will still be represented.
intervalMat <- matrix(0, nrow=nrow(mat), ncol=ncol(mat))
j <- 1
for(i in 1:(length(colors) - 1)){
if(colors[i] != colors[i+1]){
intervalMat[mat>colors[i] & mat<=colors[i+1]] <- j
j <- j + 1
} else {
intervalMat[mat==colors[i]] <- j
j <- j + 1
}
}
return(intervalMat)
}
#this actually plots the heatmap
custHeat <- function(M){
#create color bins/ranges for skewed matrix
color_bins <- c(-5, -4, -3, -2, -1, 0, 0, 1)
colors <- c('#67001F', '#B2182B', '#D6604D', '#F4A582', '#FDDBC7', "#FFFFFF", '#C6DBEF')
#create complete color palette
color_palette <- colorRampPalette(colors)(length(color_bins) - 1)
#This function assigns a number to each matrix value, so that it is colored correctly
mod_mat <- zeroInterval(random_matrix, color_bins)
## remove background and axis from plot
theme_change <- theme(
plot.background = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major = element_blank(),
panel.background = element_blank(),
panel.border = element_blank(),
axis.line = element_blank(),
axis.ticks = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank()
)
## output the graphics
ggplot(melt(mod_mat), aes(x = X1, y = X2, fill = factor(value))) +
geom_tile(color = "black") +
scale_fill_manual(values = color_palette, name = "") +
theme_change
}
##create random matrix, skewed toward negative values
random_matrix <- matrix(runif(100, min = -5, max = 1), nrow = 10)
random_matrix[1,] <- 0 #zeros should be at the top row of the heatmap
custHeat(random_matrix)
最佳答案
您可以通过在另一个方向预旋转矩阵 90 度来抵消绘图函数的 90 度逆时针旋转:
## An example matrix
(m <- matrix(1:9, ncol=3))
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
## The same matrix rotated 90 degrees clockwise
t(m)[,nrow(m):1]
# [,1] [,2] [,3]
# [1,] 3 2 1
# [2,] 6 5 4
# [3,] 9 8 7
后来添加:
一些 R 绘图函数使用与
image()
相同的约定,而其他人则没有。 (请随时添加到此列表中。)m <- matrix(1:9, ncol=3)
## ------- These plotting functions DO rotate a matrix --------
## image()
image(m, col=blues9)
## levelplot() -- a lattice equivalent of image()
library(lattice)
levelplot(m, at=(1:10)-0.5, col.regions=blues9)
## Others
contour(m)
filled.contour(m, color=colorRampPalette(blues9))
persp(m)
lattice::contourplot(m)
lattice::wireframe(m) ## Nicely illustrates the logic of the indexing it uses
## ------- These plotting functions DO NOT --------
## imageRaster() -- a graphical primitive used by image(), among other functions
plot(0:1, 0:1, type="n", xlab="", ylab="")
rasterImage(matrix(blues9, ncol=3), 0,0,1,1, interpolate=FALSE)
## grid.raster() -- imageRaster()'s counterpart in the grid graphical system
library(grid)
grid.raster(matrix(blues9, ncol=3), interpolate=FALSE)
## plot(raster()) in raster package
library(raster)
plot(raster(m), col=blues9)
关于r - 如何阻止 ggplot2 将矩阵旋转 90 度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573036/