我非常喜欢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))
我的问题主要是如何对ggplot
中绘制的数据进行离散化处理,以便图表的读者可以对颜色所代表的值做出定量结论。
其次,我怎样才能使用偏离调色板(类似于scale_fill_gradient2
),它以零或其他特定值为中心?
答案 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()
定义您可以添加的颜色:
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))