R image()绘制旋转矩阵?

kb5ga3dv  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(180)

我一直在阅读the docs的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)


yield这个:


的数据
我怎样才能使布局和打印出来的矩阵一样呢?这不是简单地把x和y转过来的问题,因为这最终会得到一个“颠倒”的图像。

cygmwpex

cygmwpex1#

你可以把矩阵倒过来,然后转置。

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

字符串
这很令人困惑,因为它是按行自下而上绘制的,而R是按列自上而下索引矩阵的。所以,第一行的像素,从左到右,对应于矩阵的第一列,自上而下。

cpjpxq1n

cpjpxq1n2#

当使用像这样的东西将矩阵视为图像时:

m <- some matrix

字符串
image(m) R把它翻了个底朝天。在一些小头痛之后,我找到了这个快速修复方法。

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


nrow(m)给出矩阵的行数
nrow(m):1反向生成序列

pcww981p

pcww981p3#

对于使用image()的人来说,这似乎是一个非常常见的问题。
矩阵被绘制为“颠倒”的原因是因为图像空间是在标准化设备坐标中定义的,也就是NDC空间。这是一个屏幕独立的坐标参考系统(crs),其中左下角是单元格(1,1),列号从左到右,而行数从矩阵的底部到顶部增加,即X={0:1},Y={0:1}
从docs:
请注意,image将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)位于左下角,并相应地输出结果。因此,我们可以看到左下角单元格中的最低阴影值和右上角单元格中的最高阴影值。
x1c 0d1x的数据
但是还要注意,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.**我强烈建议在学习ggplot 2或任何其他图形软件包之前或同时探索图形参数和与par()相关的所有内容。

https://www.rdocumentation.org/packages/graphics/versions/3.6.2/topics/par
在很多情况下,R语言的基本函数都非常健壮,它们提供的解决方案可以解放用户,同时扩展我们的语言知识,提高我们处理数据的灵活性。就我个人而言,我迷上了开源,因为我觉得我使用的每个软件都限制了我在简化更高级别函数的过程中的表达能力。
小心任何产生你不完全理解的输出的函数,如果需要的话,你不能手动复制。image()是至关重要的,因为重要的更高级别的工具,如光栅是从它改编的。

1dkrff03

1dkrff034#

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

jc3wubiy

jc3wubiy5#

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

correction在反转行时使用ncol而不是nrow。nrow仅在行和列长度相等时才有效,

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[,ncol(m):1] %>% image(main = title("Adam"))

字符串


的数据

相关问题