我正在尝试使用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:我也试过这个,只是为了好玩。你得到一个错误信息,就像你应该的那样,反映了坐标图像定义的不正确性。)
答案 0 :(得分:5)
使用image()
绘图时,z
参数最终需要是一个矩阵。然后,x
和y
值对应于矩阵行所代表的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))
这就是x
和y
参数的用途,让您放置数据矩阵。我希望能够解决问题
答案 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)
如果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)))))