R - 使用ggplot2-和raster-packages的地理参考光栅图像的原始颜色

时间:2013-10-05 10:51:01

标签: r ggplot2 tiff raster geotiff

我想在ggplot / ggplot2绘制的地图中使用>>georeferenced raster image<< (tif文件)的原始colortable作为彩色比例

由于没有找到更简单的解决方案,我从加载的栅格图像(对象)colortable的{​​{1}} - 属性中访问了legend - 插槽,如下所示:

raster1

好的,到目前为止一切顺利。现在我只需要将raster1 <- raster(paste(workingDir, "/HUEK200_Durchlaessigkeit001_proj001.tif", sep="", collapse="")) raster1.pts <- rasterToPoints(raster1) raster1.df <- data.frame(raster1.pts) colTab <- attr(raster1, "legend")@colortable 作为彩色比例应用于我现有的情节:

colortable

不幸的是,这不能按预期工作。生成的图像不显示白色旁边的任何颜色以及在未定义自定义值时经常出现的典型ggplot-grey。目前,我有点无能为力,这里真正的错误。我假设(ggplot(data=raster1.df) + geom_tile(aes(x, y, fill=raster1.df[[3]])) + scale_fill_gradientn(values=1:length(colTab), colours=colTab, guide=FALSE) + coord_fixed(ratio=1) ) 中存储的基础波段值是颜色表的索引。这可能是错的。如果错误,那么带宽值如何与raster1.df[[3]]相关联?即使我的假设是正确的:我给colortable的参数仍应该产生更丰富多彩的情节,不是吗?我查看了唯一值是什么:

scale_fill_gradientn()

输出:

sort(unique(raster1.df[[3]]))

显然,并非使用 [1] 0 1 2 3 4 5 6 7 8 9 10 11 12 的所有256个成员都提醒我颜色并不总是需要反映基础的乐队数据分布(特别是在包含多个乐队时)。

我希望,我的最后一点想法并没有让你感到困惑的是这个目标很直接。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

好的,我找到了一个可能不适用于每个地理参考栅格图像的答案,但可能差不多。

首先,我假设数据值确实代表颜色选择的机器人是错误的。空间栅格对象的colortable中有15种独特的颜色。但是,并非所有这些都被使用(14和15)。好的,现在我知道,我必须以scale_fill_gradientn理解的方式将我的值映射到相应的颜色。为此,我使用我之前的初始代码片段并定义一个新变量valTab,它存储给定波段的所有唯一数据值:

raster1 <- raster(paste(workingDir, "/HUEK200_Durchlaessigkeit001_proj001.tif", sep="", collapse=""))
raster1.pts <- rasterToPoints(raster1)
raster1.df <- data.frame(raster1.pts)
raster1.img <- melt(raster1)
colTab <- attr(raster1, "legend")@colortable
names(colTab) <- 0:(length(colTab) - 1)
valTab <- sort(unique(raster1.df[[3]]))

注意,如何为colTab定义索引名称 - 这很快就会很重要。有了这个,我可以在绘制时自动将所有活动颜色与各自的值相关联:

(ggplot(data=raster1.df)
+ geom_tile(aes(x, y, fill=raster1.df[[3]]))
+ scale_fill_gradientn(colours=colTab[as.character(valTab)])
+ coord_fixed(ratio=1)
)

使用valTab - 成员作为对应颜色索引的引用有助于始终只选择所需的颜色。我不知道在某些情况下是否需要定义values - scale_fill_gradientn()的参数。

我不确定raster()读取的光栅图像是否始终从0开始定义其值。如果不是,则需要调整names(colTab) <- 0:(length(colTab) - 1)

我希望,这有助于将来的某些人。至少,我终于有了解决方案!