【问题标题】:R image "increasing 'x' and 'y' values expected" -- but they areR图像“预期增加'x'和'y'值”——但它们是
【发布时间】:2014-06-07 02:37:49
【问题描述】:

我正在尝试在 R 中使用 image 函数。它报告“预期会增加 'x' 和 'y' 值”,但我相信我正在提供增加的 'x' 和 'y' 值。

我怀疑我不明白这个术语是什么意思,我认为它的意思是“在空间 (x, y) 内形成一组完整的坐标对的两个向量‘x’和‘y’首先按 'x' 排序,然后按 'y' 排序,这样 x[i] >= x[i+k], {i, k > 0},y 也类似。”

这是一个最小的例子。

diagnose.txt的内容如下:

0   0   1
0   1   2
1   0   3
1   1   4

我运行以下命令:

filename = "diagnose.txt"
t <- read.table(filename, header = FALSE, sep="\t", na.string='NaN')
colnames(t) <- c('x', 'y', 'z')
image(t$x, t$y, t$z)

我收到的错误消息是“期望增加 'x' 和 'y' 值”

当然,这并不意味着我必须提供(定义不明确)形式的数据:

0   0   1
1   1   2
2   2   3
3   3   4

这意味着什么? (PS:我也试过了,只是为了好玩。你应该得到一个错误消息,反映坐标图像定义的格式错误。)

【问题讨论】:

    标签: r plot


    【解决方案1】:

    当您使用image() 绘图时,最终z 参数需要是一个矩阵。然后xy 值对应于矩阵行表示的x 值,y 值对应于矩阵。如果您不提供这些值(您可以将矩阵传递给x 并完成),R 将分配从 0 到 1 的值。

    因此,将数据转换为矩阵的快速方法是使用基本函数xtabs。你可以运行

    image(xtabs(z~x+y, t))
    

    请注意,要使用此方法,请务必指定 x/y 的所有值。如果没有找到特定单元格的组合,xtabs 将返回 0,这可能不是您要与该单元格关联的值。

    因为您已经使用 0/1 进行了编码,所以就可以了。但是,如果您希望列位于 5 和 6 并且行位于 10 和 11,您会这样做

    image(5:6, 10:11, xtabs(z~x+y, t))
    

    这就是xy 参数的用途,让您放置数据矩阵。我希望这能解决问题

    【讨论】:

    • 很好地使用了xtabs。唯一的缺点是丢失的数据将被赋予零计数(即,如果对于给定的级别/值x,我们在给定的y 处缺少z,那么xtabs 将返回0 )。
    • 另一种将x, y, z 数据转换为适合使用image(或实际上是levelplot)绘制的矩阵的方法,即正确报告NA,是:m &lt;- with(t, tapply(z, list(x, y), I)); levelplot(m); image(m)。跨度>
    【解决方案2】:

    @MrFlick 很好地描述了潜在问题以及在使用image 时如何克服它。

    另一种方法是使用lattice,它对您的数据结构感到满意:

    library(lattice)
    d <- read.table(col.names=c('x', 'y', 'z'), 
                    text='0   0   1
                          0   1   2
                          1   0   3
                          1   1   4')
    

    最简单的,我们可以像这样绘制它:

    levelplot(z ~ x + y, data=d)
    

    如果z 仅包含整数,您可能希望对图例进行更多控制:

    levelplot(z ~ x+y, data=d,
              at=seq(min(d$z, na.rm=T), max(d$z, na.rm=T) + 1) - 0.5,
              colorkey=list(labels=list(
                at=seq(min(d$z, na.rm=T), max(d$z, na.rm=T)), 
                labels=seq(min(d$z, na.rm=T), max(d$z, na.rm=T)))))
    

    如果您缺少数据,这些默认情况下会绘制为白色单元格,因此最好使用不包含白色的色带,例如:

    d2 <- read.table(col.names=c('x', 'y', 'z'), 
                     text='0   0   1
                           0   1   2
                           1   0   3
                           1   1   4
                           2   0   2')
    
    levelplot(z ~ x+y, data=d2, col.regions=topo.colors,
              at=seq(min(d$z, na.rm=T), max(d$z, na.rm=T) + 1) - 0.5,
              colorkey=list(labels=list(
                at=seq(min(d$z, na.rm=T), max(d$z, na.rm=T)), 
                labels=seq(min(d$z, na.rm=T), max(d$z, na.rm=T)))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2023-03-28
      • 2016-09-17
      • 2013-04-27
      • 1970-01-01
      相关资源
      最近更新 更多