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以零或其他特定值为中心的发散调色板(类似于)?
您应该使用该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)

要定义您自己的颜色,您可以添加:
scale_fill_manual(values=c('red','green')))
Run Code Online (Sandbox Code Playgroud)
最好的方法确实是通过手动离散化来修改底层数据集。以下答案基于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)
根据@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)
| 归档时间: |
|
| 查看次数: |
2323 次 |
| 最近记录: |