使用R和Lattice的XYZ图中的高程数据的颜色渐变

时间:2015-09-15 23:11:24

标签: r plot lattice

我有一堆XYZ数据,其中X和Y是坐标,Z应该是高程(LiDAR点)。我试图用基于Z值的渐变来绘制这个点云。

这是我到目前为止所做的:

# Read the CSV file with the LiDAR point cloud (which was conveniently converted to CSV)
myData <- read.csv("./52I212_plot10.las.csv")
# We don't need all attributes, let's keep only X, Y and Z.
myData <- subset(myData, select=c(X,Y,Z))
# We want a normalized version of Z (between 0 and 1)
myData$normalZ <- (myData$Z-min(myData$Z))/(max(myData$Z)-min(myData$Z))
str(myData)

有了这个,我尝试用

创建情节
library(lattice)
ramp <- colorRampPalette(c("lightblue", "red"))
cloud(myData$Z ~ myData$X + myData$Y, xlab="X", ylab="Y", zlab="Z",pch=20,
  col.point=ramp(10)[myData$normalZ*10]) 

我希望Z值在浅蓝色和红色之间有十种可能的颜色之一。 XYZ plot, different colors

当我将plot命令更改为

cloud(myData$Z ~ myData$X + myData$Y, xlab="X", ylab="Y", zlab="Z",pch=20,
  col.point=gray(myData$normalZ))

我得到的东西更接近我的需要:

Much better!

我怀疑我在颜色渐变上做错了什么,但无法弄清楚是什么。

提前致谢

圣拉斐尔

修改

这个问题:How to match vector values with colours from a colour ramp in R?给了我很多帮助,但我仍然不明白我做错了什么。此代码有效:

myData$normalZ <- (myData$Z-min(myData$Z))/(max(myData$Z)-min(myData$Z))
ramp <- colorRamp(c("lightblue", "red"))
cols <- ramp(myData$normalZ)
cloud(myData$Z ~ myData$X + myData$Y, xlab="X", ylab="Y", zlab="Z",pch=20,
      col.point=rgb(cols,maxColorValue = 256))

Aha!

请指出原始代码可以更改的内容以使其正常工作 - 我无法弄清楚为什么在第一个图中颜色看起来是随机的。

感谢 圣拉斐尔

2 个答案:

答案 0 :(得分:2)

没有数据就无法确认,但我认为0会让你失望。您的normalZ介于0和1之间,因此10 * normalZ介于0和10之间。您将这些非整数传递给[并将它们向下舍入。 (我必须查看它,但是从?"[":&#34;数字[of i]被强制转换为整数,因为as.integer(因此被截断为零)&#34;。

0(或任何小于1的内容)作为子集索引会混淆您的颜色向量的长度,从而使事情如何匹配:

ramp(10)[c(0, 0.4, 0.8, 1.2, 1.6)]
# [1] "#ACD8E5" "#ACD8E5"

然后太短的矢量被回收。因此,您的代码可能适用于

col.point = ramp(10)[ceiling(myData$normalZ * 10)]

答案 1 :(得分:2)

将z值映射到颜色渐变中的索引有一个小错误。

library(lattice)

N <- 500
myData <- data.frame(X = runif(N,0,30),
                     Y = runif(N,0,30),
                     Z = runif(N,0,300))

myData$normalZ <- (myData$Z-min(myData$Z))/(max(myData$Z)-min(myData$Z))

ramp <- colorRampPalette(c("lightblue", "red"))

cloud(myData$Z ~ myData$X + myData$Y, xlab="X", ylab="Y", zlab="Z",pch=20,
      col.point=ramp(10)[myData$normalZ*10])

这里myData$normalZ*10将(0,1)中的Z值映射到颜色索引(0,10)。 (索引时浮点值会被截断为整数。)但是ramp(10)只返回10(而不是11)个元素,并且R向量索引必须从1开始而不是0,因此对于小的Z值,将返回NULL。这两种效果都会破坏正确的颜色插值。

然后云看起来像这样,沿着Z轴的颜色不正确:

enter image description here

像这样纠正插值

cloud(myData$Z ~ myData$X + myData$Y, xlab="X", ylab="Y", zlab="Z",pch=20,
      col.point=ramp(10)[myData$normalZ*9+1])

按预期返回结果:

enter image description here