2013-10-05 38 views
2

地理参照栅格图像的原始颜色我想使用原始colortable>>georeferenced raster image<<(TIF文件),如由ggplot/GGPLOT2绘制的地图比例尺着色的R - 使用ggplot2-和光栅包

由于没有找到一个更简单的解决方案,我访问的colortable -Slot从legend -attribute加载的光栅图像(对象)的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(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-gray。此刻,我有点无知,这里其实是错误的。我假定存储在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 

显然,并非所有的colortable的256名成员都使用这让我想起了颜色并不总是需要反思潜在的频段数据分布(尤其是包含多个频段时)。

我希望,我最后的想法并没有把你的目标搞得很直截了当。

谢谢你的帮助!

+0

这次解决方案太明显或太隐藏了吗? :) –

+0

好吧,现在我知道问题出在哪里了:'scale_fill_gradientn'函数的'values'参数只接受0和1之间的值。我必须手动缩放这种向量以获得'colortable '。完成后我会将它作为答案发布。但是,仍然存在一个问题:栅格图块后面的栅格数据值不会完全反射所有使用的颜色,因为tif图像使用白色作为无值,使用黑色来勾勒区域。必须有一种方法可以获取每个栅格像素/图块的原始颜色值。 –

+0

如果地理参考图像包含图案而不是简单的颜色填充,则颜色数量和带数据值之间的差异会更加清晰。每个单元可以有很多不同的颜色,这取决于它的图案以及是否有边框等等。 –

回答

1

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

首先,我假设数据值确实代表颜色选择的bot是错误的。空间光栅对象的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)

我希望这对未来有帮助。至少,我终于有了一个解决方案!

+0

您可以使用'raster'软件包中的'colortable'函数来访问colortable。 – 2015-10-27 04:57:06

+0

@Florian R. Klein:我试图重现这个解决方案,但我并没有真正到达那里。你用'raster1.img < - melt(raster1)'实现了什么?你使用包'reshape2'的'melt()'吗?你真的想'融化'你的rasterfile,我会期待使用'melt(raster1.df)' – Ratnanil

+0

同样的问题,稍有不同的数据,解决方案在这里:http://stackoverflow.com/questions/33359284/ R-积背景-MAP-从-的GeoTIFF与 - GGPLOT2/33367160#33362471 – Ratnanil