对于使用image() 的人来说,这似乎是一个非常普遍的问题。
矩阵被“倒置”绘制的原因是因为图像空间是在标准化设备坐标中定义的,也就是 NDC 空间。这是一个与屏幕无关的坐标参考系统 (crs),其中左下角是单元格 (1,1),列号从左到右进行,而行号从矩阵的底部到顶部增加,即 X ={0:1},Y={0:1}
来自文档:
请注意,图像将 z 矩阵解释为 f(x[i], y[j]) 值的表,因此 x 轴对应于行号,y 轴对应于列号,第 1 列位于底部,即矩阵的传统印刷布局的 90 度逆时针旋转。
不应忽视逆时针旋转这一点,因为它会影响操作顺序,我们需要得到一个看起来符合我们预期的绘图。
票数最高的答案在理论上是正确的:
你可以反转矩阵,然后转置。
但是,执行此操作的最简单方法不需要任何循环和/或apply()
R 中的标准矩阵从上到下打印,而传统上我们希望看到数据的逐行投影以用于显示目的。
> m <- matrix(c(1:9),ncol=3)
> m
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> image(m)
NDC空间中的图像函数要求单元格(1,1)在左下角,并相应输出结果。因此,我们在左下角的单元格中看到最低的阴影值,在右上角的单元格中看到最高的阴影值。
但也请注意,image() 的输出不仅仅是标准矩阵的行反转,而是逆时针旋转,因此m 的第一列变成image(m) 的最后一行 .
所以我们可以进行自动转置,但我们需要先正确地进行反转,这意味着我们必须通过选择列对m 进行排序。通常排序/排序是按行进行的,但 NDC 空间会反转所有内容。
How to reverse rows in matrix?
要按照上述反转标准矩阵的行,我们会调用:
m[nrow(m):1, ]
相反,我们必须反转查询逻辑,以预期image() 应用的轮换。因此我们从上一个答案中得到了解决方案:
> m <- m[,nrow(m):1]
> m
[,1] [,2] [,3]
[1,] 7 4 1
[2,] 8 5 2
[3,] 9 6 3
> image(m)
将上述方法与将标准矩阵转换为 NDC 空间的一般方法进行对比,如下所示:
m <- t(matrix(c(1:9),ncol=3))
m <- m[nrow(m):1,]
注意转置是如何首先执行的,并假设数据顺时针旋转;并且子集/排序是逐行的。这是我们之前校正过程的镜像,我们首先按列排序,然后使用image() 逆时针转置。
P.S. 我强烈主张在学习 ggplot2 或任何其他图形包之前或同时探索图形参数以及与 par() 相关的所有内容。
https://www.rdocumentation.org/packages/graphics/versions/3.6.2/topics/par
在许多情况下,基本 R 函数非常健壮,并提供了可以解放用户的解决方案,同时扩展我们对语言的了解并提高我们对数据的灵活性。就个人而言,我迷上了开源,因为我觉得我使用的每一个软件装备都限制了我在简化到更高级别功能的过程中的表现力。
当心任何产生您不完全理解并且在必要时无法手动重现的输出的函数。 Image() 很重要,因为重要的更高级别的工具(如光栅)是从它改编而来的。