我有一堆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])
当我将plot命令更改为
时cloud(myData$Z ~ myData$X + myData$Y, xlab="X", ylab="Y", zlab="Z",pch=20,
col.point=gray(myData$normalZ))
我得到的东西更接近我的需要:
我怀疑我在颜色渐变上做错了什么,但无法弄清楚是什么。
提前致谢
圣拉斐尔
修改
这个问题: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))
请指出原始代码可以更改的内容以使其正常工作 - 我无法弄清楚为什么在第一个图中颜色看起来是随机的。
感谢 圣拉斐尔
答案 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轴的颜色不正确:
像这样纠正插值
cloud(myData$Z ~ myData$X + myData$Y, xlab="X", ylab="Y", zlab="Z",pch=20,
col.point=ramp(10)[myData$normalZ*9+1])
按预期返回结果: