我正在使用ggplot2在世界地图上绘制一些气候模拟作为栅格。
我给表示值的连续比例设置scale_fill_gradient()中的范围。
这些地图不止一个,我需要使它们具有可比性:因为,我需要为所有表示的变量赋予相同的范围。每个变量的大部分数据分布在我为比例选择的范围(-1.5,1.5)范围内。
我的问题与异常值有关。使用这些设置,我将它们以中性色(灰色)显示在地图中,而我希望用缩放的最小/最大边界的相同颜色表示它们。
此link
提供了数据这是我的代码
library(rgdal)
library(ggplot2)
library(raster)
library(grid)
setwd("myfolder")
world<-readOGR("TM_WORLD_BORDERS-0.3.shp", layer="TM_WORLD_BORDERS-0.3")
world=fortify(world, region="ISO3")
raster<-stack("d_spi24_neg45")
r_points = rasterToPoints(raster)
r_df = data.frame(r_points)
summary(r_df[,3])
Min. 1st Qu. Median Mean 3rd Qu. Max.
-3.30000 -0.30000 0.00000 -0.05307 0.20000 2.50000
ggplot(data=r_df) +
geom_tile(aes(x=x,y=y, fill=d_spi24_neg45))+
scale_fill_gradient(limits=c(-1.5, +1.5), low="blue", high="red")+
coord_equal() +
theme_bw() +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
panel.grid.major = element_blank(),
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.minor=element_blank(),
plot.background=element_blank(),
legend.position = "bottom",
legend.text=element_text(size=10),
legend.key.height=unit(0.25,"cm"),
legend.key.width=unit(2,"cm"),
legend.title=element_blank())+
geom_polygon(data = world, aes(x = long, y = lat, group=group), color = "black",
fill="transparent", size = 0.25)+ xlim(-165, 180) + ylim(-58,85)
我的结果,正如您所看到的(例如北加利福尼亚州),我的灰度值与异常值相对应:
我看到两种解决方案:
第一个(不是我的首选)是用以下内容挤压代表范围内的数据:
r_df$d_spi24_neg85[r_df$d_spi24_neg85 < -1.5] <- -1.5
r_df$d_spi24_neg85[r_df$d_spi24_neg85 > 1.5] <- 1.5
修改:使用以下方法可以更好地解决第一个解决方案:
scale_fill_gradient(limits=c(-1.5, +1.5), low="blue", high="red", oob=squish)+
正如jlhoward在引用this other question的评论中所建议的那样。 结束修改
第二个解决方案可能是以我的范围为中心的对数刻度???接受建议。 感谢