gpt4 book ai didi

r - 在ggplot中使用两个梯度分离土地和水

转载 作者:行者123 更新时间:2023-12-04 10:31:50 25 4
gpt4 key购买 nike

我试图在 map 上为土地和水获得两个单独的渐变。我能够得到水的梯度(第一个图),但不能得到土地。

如何在此代码中为土地设置灰色渐变(类似于下面的图 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

enter image description here

我尝试在 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

enter image description here

最佳答案

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

enter image description here

关于r - 在ggplot中使用两个梯度分离土地和水,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com