将MATLAB中的'imagesc'函数转换为适用于R语言中的'matlab'库的'imagesc'函数

3
我刚接触R语言,之前用过MATLAB。现在我要将MATLAB脚本转换为R脚本。目前为止,一切都很顺利,除了如何绘制输出图形。

MATLAB

这里是用imagesc绘制图形的MATLAB代码:

imagesc(velocity,time,myplot,[-35, 0]);

其中:

velocity: 1 x 50 矩阵

time: 1 x 10 矩阵

myplot: 10 x 50 矩阵

Imagesc的解释

更多详情可以在这里找到

imagesc(x,y,C)将C显示为图像,并使用向量x和y指定x轴和y轴的范围。如果x(1) > x(2)或y(1) > y(2),图像将左右翻转或上下翻转。如果x和y是标量,则将图像平移到指定位置(x,y),使得图像的左上角从(x,y)开始。

R

R的imagesc版本可以在这里找到

问题:

如何在R中复制MATLAB的clims部分中的数据值到颜色映射值,就像这个例子中的[-35, 0]: http://i.imgur.com/eVy6V8N.png

它将特定范围之外的数据值映射到相同的颜色限制,有效地作为图像上噪声的滤波器。
这是没有[-35, 0] clims部分的Matlab和R的imagesc函数的结果: http://i.imgur.com/DzDjrzu.png

如您所见,它们是完全一样的。

这是所需的结果,包括Matlab的[-35, 0]部分: http://i.imgur.com/Qbx6jNI.png

左边是Matlab,右边是R。左边的Matlab图像是我想要生成的,这都归功于Matlab版本脚本中的那一个进程clims [-35, 0]


有一些具备MATLAB访问权限的R语言用户,但并不多。为什么不描述一下imagesc函数实际上是做什么的?以及这些参数如何被解释? - IRTFM
@Dwin 我已经编辑了我的原始问题,并解释了imagesc。 - Resso
@CarlWitthoft 不,我真的只是希望那个工具能够产生与Matlab使用的工具相同的结果。如果它能做到这一点,我们就不会在这里了 :) 我想,如果你需要更具体的信息,[-35, 0] 部分是我无法在R中复制的部分 - 这来自于提供的链接中的 clims - Resso
@CarlWitthoft 我已经修改了我的问题,并提供了一个基础问题。 - Resso
@CarlWitthoft 我已经尝试了您的解决方案,但不幸的是结果相同。这是Matlab和R imagesc函数没有[-35, 0] clims部分的结果:http://i.imgur.com/DzDjrzu.png如您所见,它们是相同的。这是期望的结果,包括Matlab中的[-35, 0]部分:http://i.imgur.com/Qbx6jNI.png左边是Matlab,右边是R。左边的Matlab图像是我想要生成的,这完全归功于Matlab版本脚本上的那个进程clims [-35, 0] - Resso
显示剩余3条评论
2个回答

3

我认为你可以通过预处理数据,使得超出范围的值被压缩到范围限制内,以达到与 clims 相同的效果。

z = matrix(rnorm(10*10, sd=3), 10)

z2 <- z
z2[z2 > 3] <- 3
z2[z2 < -5] <- -5

# or simply
z2 = scales::squish(z, c(-5, 3))

filled.contour(z)

enter image description here

filled.contour(z2)

enter image description here


1
阅读问题、相关链接和通过谷歌找到的其他材料后,我理解您需要R中imageaxis函数的综合能力。其他一些材料说imagesc实际上只是重新标记轴注释(并且它具有一些额外的颜色缩放功能,您似乎不需要)。从文件中读取图像可能需要一些额外的软件包。有一个grImport软件包可用于pdf文档的处理。还有一些专门处理特定格式的软件包,例如tiffrtiff。如果您要绘制一个中等大小的矩阵,应该提供dput(mat)。在没有示例和具体指导的情况下,可以提供?image示例部分中间的示例适应。
> image(t(volcano)[ncol(volcano):1,])   # the default axes lebeling

 image(t(volcano)[ncol(volcano):1,], axes=FALSE)
 axis(1, at=seq(0,1,.1), labels= seq(0,100,10) )
 axis(2, at=seq(0,1,.1), labels= rev( seq(0,100,10)) )

enter image description here


不幸的是,我必须使用imagesc,因为它具有clims函数,其中包含将矩阵归一化到[-35,0]范围的部分。我似乎找不到如何在R版本上执行此操作的方法。除非您知道如何将矩阵归一化到该范围[-35,0] - Resso
通过指定颜色值限制(clims),将低值映射到颜色图谱的第一种颜色,高值映射到颜色图谱的最后一种颜色,可以扩展中程颜色分辨率。如果当前的颜色图谱大小为81-by-3,则以下语句clims = [10 60] imagesc(C, clims)将映射C数据值。 - Resso
此部分:http://i.imgur.com/eVy6V8N.png,其中将数据值映射到颜色值,特别是当其超出指定范围时。 - Resso
你可以使用xlim/ylim翻转坐标轴,只需像这样:image(x = seq(0, 100, length = ncol(volcano)), y = seq(0, 100, length = nrow(volcano)), t(volcano)[ncol(volcano):1, nrow(volcano):1], ylim = c(100, 0), xlab = "", ylab = "") - mdsumner
@mdsummer,那我在哪里替换 [-35,0] 数据映射到颜色映射值呢? - Resso
@mdsummer,你看了我提供的图片吗?它需要将每个光谱末端的颜色映射到矩阵中超出特定范围的值。 - Resso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接