我可以使用filled.contour绘制带有十进制笛卡尔坐标的数据吗?

时间:2015-10-20 15:51:47

标签: r plot

我有一个288000x3矩阵(288000行,3列)的x和y笛卡尔坐标,从-60到60,小数点跟踪到8个位置以及这些坐标处的值。

实施例 -

        y.cart     x.cart      value
[1,] 0.001308930 0.07498858  -49.36752
[2,] 0.002617462 0.07495431  -48.33903
[3,] 0.003925197 0.07489722  -51.42450
[4,] 0.005231736 0.07481730  -51.93874
[5,] 0.006536681 0.07471460 -513.73075
[6,] 0.007839635 0.07458914  -52.45299
[7,] 0.009140201 0.07444096  -51.93874
[8,] 0.010437983 0.07427011  -48.85327
[9,] 0.011732585 0.07407663  -49.36752
[10,] 0.013023613 0.07386058  -50.91025

这是天气雷达反射率数据,我需要将其绘制成看起来像fill.contour创建的输出,但为了使用filled.contour,值必须在矩阵中,因为函数使用矩阵位置作为情节的坐标,它与我的数据组织方式无关。有没有办法将filled.contour与此表单中的数据一起使用,或者,是否有其他方法可以执行此操作?我已经花了两天时间摆弄它并且已经走得很远了。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以尝试获取Matrix中的值列。这可以在for循环中完成。但为此,我假设,在您的数据中,变量y.cart和x.cart中的y和x值不是唯一的。我这样做是因为我认为你有类似地图的东西,在这张地图上,网格中的每个点都是一对坐标。

这是否正确,您可以尝试以下代码:

# Some sample data:
y.cart <- x.cart <- seq(-60,60,length.out = 600)

# Bring it in the form like your data are:
DF <- data.frame(x.cart = sample(x = x.cart, length(x.cart)^2, replace = TRUE), 
                 y.cart = sample(x = y.cart, length(y.cart)^2, replace = TRUE), 
                 value = rnorm(length(y.cart)^2))

# Also works for a Matrix:
DF <- as.matrix(DF)

# Define the Matrix Z. In this Matrix are just NAs, because if a value on a 
# special coordinate doesn't exist there should be nothing drawn:
Z <- matrix(rep(NA,length(DF[,1])^2), nrow = length(DF[,1]))

# Get the unique points which represent the x and y coordinate. It's important
# to use the unique points for getting the index for the Matrix out of this vectors: 
x <- sort(unique(DF[,1]))
y <- sort(unique(DF[,2]))

# In this loop every row in de data.frame (or matrix) is matched with the vector
# x for the i-th row in the Matrix and with the vector y for the j-th column in
# the Matrix Z[i,j]:
for(i in seq(along = DF[,1])) {

  Z[which(x == DF[i,1]),which(y == DF[i,2])] <- DF[i,3]

}

# Now you can use persp or filled.contour with the following call:
persp(x,y,Z)
filled.contour(x,y,Z)

这适用于我的样本数据,即使它对它们没有意义。请记住,for循环不是很快,而且您的数据可能需要一段时间。您可以构建一个进程栏来控制循环中的状态:

pb <- txtProgressBar(min = 1, max = length(DF[,1]), style = 3)
for(i in seq(along = DF[,1])) {

  Z[which(x == DF[i,1]),which(y == DF[i,2])] <- DF[i,3]

  setTxtProgressBar(pb, i)
}

x和y必须具有相同的长度,并且矩阵Z是具有尺寸长度(x)和长度(y)的矩阵。

我希望这适合你。如果我对数据的想法不正确,您可以提供有关数据的更多详细信息。不要忘记用矩阵的名称替换DF。