R图像“增加'x'和'y'值预期” - 但它们是

时间:2014-06-07 02:37:49

标签: r plot

我正在尝试使用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:我也试过这个,只是为了好玩。你得到一个错误信息,就像你应该的那样,反映了坐标图像定义的不正确性。)

2 个答案:

答案 0 :(得分:5)

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

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

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

image

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

因为你已经用0/1编码,所以会很好。但是如果您希望列位于5和6并且行位于10和11,则可以执行

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

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

答案 1 :(得分: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)

plot1

如果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)))))

plot2

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

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)))))

plot3