4

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

由于没有找到更简单的解决方案,我从加载的光栅图像(对象)的 - 属性访问colortable-slot,如下所示:legendraster1

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(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)
)

不幸的是,这并没有按预期工作。生成的图像除了白色和典型的 ggplot-grey 之外没有显示任何颜色,通常在没有定义自定义值时出现。目前,我有点不知道这里到底出了什么问题。我假设存储在其中的基础波段值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 个成员colortable都被使用,这提醒我颜色并不总是需要反映底层的波段数据分布(尤其是在包含多个波段时)。

我希望,我最后的想法并没有让您对目标非常简单这一事实感到困惑。

谢谢您的帮助!

4

1 回答 1

3

好的,我找到了一个答案,它可能不适用于那里的每个地理参考光栅图像,但可能几乎适用。

首先,我认为数据值确实代表颜色选择的假设是错误的。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-members 作为对相应颜色索引的引用有助于始终只选择需要的颜色。我不知道在某些情况下是否需要定义values- 参数。scale_fill_gradientn()

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

我希望,这对将来的人有所帮助。至少,我终于有办法了!

于 2013-10-06T14:02:53.553 回答