繁体   English   中英

R image() 绘制矩阵旋转?

[英]R image() plots matrix rotated?

我一直在阅读 R image() 的文档,但我不明白。 为什么这个矩阵:

> mat1
     [,1] [,2] [,3]
[1,]    1    0    1
[2,]    0    1    0
[3,]    0    0    0

像这样绘制:

> image(c(1:3), c(1:3), mat1)

产生这个:

在此处输入图像描述

以及如何使布局与打印的矩阵相同? 这不仅仅是用转置来翻转 x 和 y 的问题,因为这最终会得到一个“颠倒”的图像。

您可以反转矩阵,然后转置。

mat1 <- apply(mat1, 2, rev)
image(1:3, 1:3, t(mat1))

这很令人困惑,因为它从下往上按行绘制,但 R 按列、自上而下索引矩阵。 因此,第一行中的像素,从左到右,对应于矩阵中的第一列,自上而下。

当使用这样的东西查看矩阵作为图像时:

m <- some matrix

image(m) R 把它倒过来。 经过一些小小的头痛,我找到了这个快速解决方案。

image(m[,nrow(m):1])

nrow(m)给出矩阵的行数

nrow(m):1使序列向后

对于使用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 空间会反转所有内容。

如何反转矩阵中的行?

要如上所述反转标准矩阵的行,我们将调用:

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()逆时针转置。

PS我强烈主张在研究 ggplot2 或任何其他图形包之前或同时探索图形参数和与par()相关的所有内容。

https://www.rdocumentation.org/packages/graphics/versions/3.6.2/topics/par

在许多情况下,基础 R 函数非常健壮,提供的解决方案可以解放用户,同时扩展我们的语言知识并提高我们对数据的灵活性。 就我个人而言,我迷上了开源,因为我觉得我使用的每个软件装备都限制了我在简化到更高级别功能的过程中的表现力。

当心任何产生您不完全理解的输出并且在必要时无法手动重现的函数。 Image()至关重要,因为重要的高级工具(如光栅)都是从它改编而来的。

如果你想要一个倒置的镜像而不是旋转,你可以使用 R 包“Thermimage”中矩阵的mirror.matrix()函数。

我认为安迪和亚当最好。 我相信罗夏的应用需要按行(margin = 1)而不是按列来制作镜像。

m <- matrix(c(1:9), nrow = 3)
par(mfrow = c(1,4))
m %>% image(main = title("orig"))
m %>% apply(2,rev) %>% t() %>% image(main = title("Rorschach"))
m %>% apply(1,rev) %>% t() %>% image(main = title("Rors alt"))
m[,nrow(m):1] %>% image(main = title("Adam"))

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM