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

fab*_*ern 7 gis r raster ggplot2

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

但是,我仍然想知道是否可以轻松地将连续的栅格值分成不连续的区域,并为每个区域分配一种颜色,如图例所示(许多GIS系统都这样做).

我尝试了选项的参数guide = "legend"breaks参数scale_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))
Run Code Online (Sandbox Code Playgroud)

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

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

Osc*_*ñán 8

您应该使用该raster包来处理栅格数据.该软件包提供了几种与分类栅格一起使用的功能.例如,reclassify您可以将连续文件转换为离散栅格.下一个例子改编自 这个问题:

library(raster)

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

另一方面,如果你想使用这些ggplot2函数,那么这个 rasterVis包提供了一个简单的包装器,ggplot它可以处理RasterLayer对象:

library(rasterVis)

gplot(r) +
    geom_raster(aes(fill = factor(value))) +
    coord_equal()
Run Code Online (Sandbox Code Playgroud)

带栅格的ggplot

要定义您自己的颜色,您可以添加:

scale_fill_manual(values=c('red','green')))
Run Code Online (Sandbox Code Playgroud)


fab*_*ern 2

最好的方法确实是通过手动离散化来修改底层数据集。以下答案基于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))
  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

2021年5月31日更新:

根据@slhck的评论,确实可以将美学映射中的数据离散化,如下所示:

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)
discr_colors <- scales::div_gradient_pal(low = "darkred", mid = "white",  high = "midnightblue")(seq(0, 1, length.out = length(breaks)))
# [1] "#8B0000" "#B1503B" "#D18978" "#EBC3B9" "#FFFFFF" "#C8C0DB" "#9184B7" "#5B4C93" "#191970"

ggplot(data = data, aes(x=x,y=y)) +
  geom_raster(aes(fill = cut(value, breaks, right=FALSE))) +
  coord_equal() +
  scale_fill_manual(values = discr_colors) +
  guides(fill = guide_legend(reverse=T))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述