Dom*_*ack 2 maps plot r colors
我有一个包含经度、纬度和一个显示湿度的值列的数据集,长度约为 300 行。每个点显示不同位置的湿度。我想将它们全部绘制在地图上,并根据它们的值(例如渐变颜色)为它们着色并添加图例。它有点类似于这里的问题,但我无法让它工作。代码基本上就在那里,但只有在图例中正确地着色和显示它并不能真正起作用。这些点代表非洲的一条线,湿度值最初是从栅格数据集中提取的,它们包含几个数字。我创建了一些示例数据来说明我卡在哪里。
library("maps")
library("raster")
# create sample data
lon <- seq(from=35.6, to=43.2, by=0.2)
lat <- seq(from=10.5, to=22.2, by=0.2)
humidity <- runif(59, min=9.6, max=13.5)
data <- data.frame(lon,lat, humidity)
colfunc<-colorRampPalette(c("dodgerblue2","khaki","orangered")) # create colours
map('world', xlim = c(20, 80), ylim = c(5, 30), lwd=0.5, col = "grey95", fill = T, interior = FALSE)
title("specific humidity along line")
map.axes()
points(data$lon, data$lat, cex=.5, pch=19, col=colfunc(100))
legend("topleft",title="q (g/kg)",legend=c(11,11.5,12,12.5,13),col =colfunc(100), pch=20)
Run Code Online (Sandbox Code Playgroud)
结果图如下所示:
图例显然有问题,我想在图例中显示一些具有相应颜色和值的点,甚至使用漂亮的颜色条。我不确定为什么图例中的颜色只是蓝色。我还怀疑点线没有根据它们的实际值着色,只是显示整个颜色渐变。感谢您的任何建议!
更新来自 Alex 的代码:
n <- 10
colfunc<-colorRampPalette(c("dodgerblue2","khaki","orangered")) # create colours
mycol <- function(x, myrange, n=10) round( 1+(x-myrange[1])/diff(myrange) * (n-1))
map('world', xlim = c(20, 80), ylim = c(5, 30), lwd=0.5, col = "grey95", fill = T, interior = FALSE)
title("specific humidity along line")
map.axes()
points(data$lon, data$lat, cex=.5, pch=19, col=colfunc(n)[mycol(humidity, range(humidity), n)])
mylist <- c(10,11,11.5,12,12.5,13)
legend("topleft",title="q (g/kg)",legend=mylist,col = colfunc(n)[mycol(mylist,range(humidity), n)], pch=20)
Run Code Online (Sandbox Code Playgroud)
这产生了这个情节:
点重叠并且很难看到点的整体值,有没有办法使用色带根据定义的范围为点着色?例如值 10 到 11 的“红色”,11 到 12 的“绿色”等等?
小智 5
你可能混淆了一些事情。在您的代码中,您绘制的点的颜色只是点顺序的结果(第一个点获得列表中的第一个颜色等)。颜色不取决于值。
现在,在 0:100 全范围湿度值的颜色渐变中,坦率地说,您将看不到值 11 和 13 之间的任何差异。您需要更多的对比度。所以你应该首先做
mycol <- function(x, myrange, n=100) round( 1+(x-myrange[1])/diff(myrange) * (n-1))
Run Code Online (Sandbox Code Playgroud)
现在mycol(x, range(humidity), n)将返回一个整数,最小值为 1,最大值为 n。
n=100
points(data$lon, data$lat, cex=.5, pch=19, col=colfunc(n)[mycol(humidity, range(humidity), n)])
mylist <- c(11,11.5,12,12.5,13)
legend("topleft",title="q (g/kg)",legend=mylist,col = colfunc(n)[mycol(mylist,range(humidity), n)], pch=20)
Run Code Online (Sandbox Code Playgroud)