【问题标题】:Plot continuous raster data in binned classes with ggplot2 in R在 R 中使用 ggplot2 绘制分箱类中的连续栅格数据
【发布时间】:2014-08-13 07:47:36
【问题描述】:

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

但是,我仍然想知道是否可以轻松将连续栅格值分箱到离散箱中并为每个箱分配一种颜色,如图例所示(与许多 GIS系统会)。

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

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

【问题讨论】:

  • 另一种方法可能是使用来自rasterVis 包的levelplot

标签: r ggplot2 gis raster


【解决方案1】:

您应该使用raster 包来处理栅格数据。这 包提供了几个功能来处理分类 光栅。例如,使用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()

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

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

【讨论】:

  • 加 1,因为fill = factor(value) 不超过 1
【解决方案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))
  

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

【讨论】:

  • 这种离散化也可以通过美学映射中的舍入(或使用天花板/地板函数)轻松执行。
猜你喜欢
  • 1970-01-01
  • 2020-04-30
  • 2016-04-02
  • 2021-09-17
  • 1970-01-01
  • 2021-02-10
  • 2013-06-06
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多