r - 在ggplot中使用两个梯度分离土地和水
问题描述
我试图在地图上为土地和水获得两个单独的渐变。我能够得到水梯度(第一个图),但不能得到土地。
如何在此代码中为土地设置灰色渐变(类似于下图 2)?
样本数据
library(marmap)
library(ggplot2)
greys <- c(grey(0.6), grey(0.93), grey(0.99))
# Get map data
bat <- getNOAA.bathy(-68, -51, -48, -39, res = 1, keep = TRUE)
使用水梯度生成图
autoplot(bat, geom = c("raster", "contour"), colour = "white", size = 0.1) +
scale_fill_gradientn(limits = c(-6600, 0), colors = c("steelblue4", "#C7E0FF")) +
NULL
我尝试在 中设置不同的限制scale_fill_gradientn
,但运气不佳:
autoplot(bat, geom = c("raster", "contour"), colour = "white", size = 0.1) +
scale_fill_gradientn(limits = c(min(bat), max(bat)),
colors = c("steelblue4", "#C7E0FF", greys)) +
NULL
期望的输出(使用 base R 的绘图功能完成)
plot(bat, image = TRUE, land = TRUE, lwd = 0.1, bpal = list(c(0, max(bat), greys), c(min(bat), 0, blues)))
plot(bat, lwd = 0.8, deep = 0, shallow = 0, step = 0, add = TRUE) # highlight coastline
解决方案
使用cut
和方法scale_fill_manual
:
它比@Z.Lin 的回答(我个人会使用)涉及更多,但这种方法可能会给您更多的控制权,而且geom_raster
情节非常快。
我已经手动完成了这一切,但您可以想象一个函数,它采用高程向量和许多所需的中断,然后将向量切割成一组分类中断并制作适当的标签。这是sp::spplot()
默认情况下对连续字段所做的,它使用nbreaks = 16
. 您需要强制零海拔中断以区分陆地和海洋。
这是可以开发的一般想法。
# convert to raster, then data frame
library(raster)
d <- as.raster(bat)
d <- as.data.frame(d, xy=TRUE)
# upper and lower elevation bounds
z <- max(d$layer)
a <- min(d$layer)
# breaks and labels for color scale
brks <- c(a, 1000, 500, 0, -500, -1000, -2000, -3000, -4000, -5000, z)
labs <- c("> 1000", "500:1000", "0:500", "-500:0", "-1000:-500", "-2000:-1000",
"-3000:-2000", "-4000:-3000", "-5000:-4000", "< -6514")
d$bin <- cut(d$layer, breaks = brks, labels = labs)
d <- d[!is.na(d$bin), ] # filter sneaky NA values
library(colormap)
gr <- colormap(colormaps$greys, nshades = 10)[4:6]
bl <- colormap(colormaps$velocity_blue, nshades = 13)[3:9]
cols <- c(bl, gr)
# plot
ggplot(d, aes(x, y, fill = bin)) +
geom_raster() +
scale_fill_manual(values = cols, limits = labs, labels = rev(labs)) +
theme_minimal() +
labs(fill = "Elevation (ft)")
推荐阅读
- python - RuntimeError:模型类未声明显式 app_label 并且不在 INSTALLED_APPS for Django OAuth Toolkit 中的应用程序中
- computer-science - 不表示序列结束的哨兵术语是什么?
- docker - “docker search” 在 bash 中返回的结果比在 hub.docker.com 上少得多
- python-3.x - 如何在非 Sequential() Keras 模型的层中设置权重和梯度权重
- r - 如何在 1 个图中绘制多个数据集的概率密度函数图?
- three.js - A-Frame:0.9.0 和 0.9.2 版本之间的“透视截图”功能中断?
- docker - 无法使用手动 iptables 在 Dockerfile 中运行 apt-get update
- javascript - JQuery - 单击切换按钮时,附加表会不断增加自身或复制自身
- powershell - 处理目录存在异常
- c++ - 增强器使用先前的 DMatrix 后 XGDMatrixCreateFromMat 失败