使用R中的ggplot2在分箱类中绘制连续栅格数据

时间:2014-08-13 07:47:37

标签: r ggplot2 gis raster

我非常喜欢ggplot2的外观和感觉,并且经常使用它们来显示栅格数据(例如,时变降水场的时间分面非常有用)。

但是,我仍然想知道是否很容易将连续栅格值分成不连续的分档并为每个分档分配单一颜色,如图例所示(如很多GIS系统都有。)

我尝试使用guide = "legend"选项的breaksscale_fill_gradient参数。但是,这些仅影响图表侧面的图例,但绘制的值仍然是连续的。

library(ggplot2)
data <- data.frame(x=rep(seq(1:10),times = 10), y=rep(seq(1:10),each = 10), value = runif(100,-10,10))
ggplot(data = data, aes(x=x,y=y)) +
  geom_raster(aes(fill = value)) +
  coord_equal() +
  scale_fill_gradient2(low = "darkred", mid = "white", high = "midnightblue",
                       guide = "legend", breaks = c(-8,-4,0,4,8))

我的问题主要是如何对ggplot中绘制的数据进行离散化处理,以便图表的读者可以对颜色所代表的值做出定量结论。

其次,我怎样才能使用偏离调色板(类似于scale_fill_gradient2),它以零或其他特定值为中心?

2 个答案:

答案 0 :(得分:8)

您应该使用raster包来处理栅格数据。这个 package提供了几个与分类一起工作的功能 栅格。例如,使用reclassify,您可以转换为连续的 将文件存入离散栅格。下一个例子改编自 this question

library(raster)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r <- reclassify(r, c(0, 500, 1,
                     500, 2000, 2))

另一方面,如果你想使用ggplot2函数,那么 rasterVis包提供了ggplot周围的简单包装 适用于RasterLayer个对象:

library(rasterVis)

gplot(r) +
    geom_raster(aes(fill = factor(value))) +
    coord_equal()

ggplot with raster

定义您可以添加的颜色:

scale_fill_manual(values=c('red','green')))

答案 1 :(得分:1)

最好是通过手动离散化来修改基础数据集。下面的答案基于joran的答案。

library(ggplot2)
set.seed(1)
data <- data.frame(x     = rep(seq(1:10),times = 10), 
                   y     = rep(seq(1:10),each = 10),
                   value = runif(100,-10,10))

# Define category breaks
breaks <- c(-Inf,-3:3,Inf)
data$valueDiscr <- cut(data$value,
                       breaks = breaks,
                       right = FALSE)

# Define colors using the function also used by "scale_fill_gradient2"
discr_colors_fct <- 
  scales::div_gradient_pal(low = "darkred",
                           mid = "white", 
                           high = "midnightblue")
discr_colors <- discr_colors_fct(seq(0, 1, length.out = length(breaks)))
discr_colors
# [1] "#8B0000" "#B1503B" "#D18978" "#EBC3B9" "#FFFFFF" "#C8C0DB" "#9184B7" "#5B4C93" "#191970"

ggplot(data = data, aes(x=x,y=y)) +
  geom_raster(aes(fill = valueDiscr)) +
  coord_equal() +
  scale_fill_manual(values = discr_colors) +
  guides(fill = guide_legend(reverse=T))

enter image description here