R:地图上基于颜色值的颜色点并添加图例

时间:2018-02-09 05:41:43

标签: r plot colors maps

我有一个包含经度,纬度和值列的数据集,显示湿度,长度约为300行。每个点显示不同位置的湿度。我想在地图上绘制所有这些并根据它们的值(例如渐变颜色)对它们进行着色并添加图例。它有点类似于question here,但我无法让它工作。代码基本上是存在但只有着色并在图例中正确显示它并不真正起作用。这些点代表非洲的一条线,湿度值最初是从栅格数据集中提取的,它们包含几个数字。我创建了一些示例数据来说明我遇到的问题。

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)

结果情节如下所示:enter image description here 传说中有些东西显然是错误的,我想在图例中显示一些具有相应颜色和值的点,或者甚至使用漂亮的颜色栏。我不确定为什么图例中的颜色只是蓝色。我还怀疑点线不是根据它们的实际值着色而只是显示整个颜色渐变。谢谢你的任何建议! 使用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)

生成此情节:enter image description here 点是重叠的,很难看到点的整体值,有没有办法使用colourramp根据定义的范围对点进行着色?例如“红色”表示值10到11,“绿色”表示11到12,依此类推?

2 个答案:

答案 0 :(得分:3)

你可能混淆了一些事情。在您的代码中,您绘制的颜色只是点的顺序(第一个点在列表中获得第一个颜色等)的颜色。颜色并不取决于价值。

现在,在整个范围0:100的湿度值的颜色渐变中,坦白地说,您将看不到值11和13之间的任何差异。您需要更多的对比度。 所以你应该先做

mycol <- function(x, myrange, n=100) round( 1+(x-myrange[1])/diff(myrange) * (n-1))

现在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)

答案 1 :(得分:1)

您可以查看图例

library("maps")
library("raster")


n <- 4 # number in legend
# 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(39, min=9.6, max=20)
data <- data.frame(lon,lat[1:39], 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=18, col=colfunc(nrow(data)))
legend("topleft",title="q (g/kg)",legend=round(seq(min(humidity),max(humidity),length.out = n),0),col =colfunc(n), pch=20)