R spplot标签重叠
R spplot label overlapping
我正在处理的数据每个级别都有很多相同的值(东南部 5 个州的每日降雨量),例如:
values(r1) <- c(rep(0.1,25575),rep(0.2,25575),rep(0.3,25575),rep(0.3,25575))
因此在输出图像中,每个级别的地图都充满了相同的label/value,有没有办法让每个级别的标签只显示一次或两次,例如:标签 0.1 只显示一次对于级别 1,不是 25575 次?
这里是测试代码:
library(sp)
library(rgdal)
library(raster)
library(maptools)
setwd("C:/Users/rosaR/Data/PRISM")
r1 <- raster(xmn=-88.77083, xmx=-75.02083, ymn=24.0625,ymx=36.97917, nrow=310, ncol=330,crs='+proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0')
#values(r1) <- c(rep(0.1,25575),rep(0.2,25575),rep(0.3,25575),rep(0.4,25575))
values(r1) <- c(rep(seq(from=0.1,to=3,by=0.1),3410))
newproj <- "+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs"
r1 <- projectRaster(r1, crs=newproj)
png(file=paste("test.png",sep=""), width=1350, height=700, units="px")
at=c(0,0.15,0.3,0.45,0.5,0.65,0.7,0.85,0.9,1.05,1.1,1.25,1.3,1.45,1.5,1.65,1.7,1.85,1.9,2.05,2.1,2.25,2.3,2.45,2.5,2.65,2.7,2.85,2.9,3)
spplot(r1,
#sp.layout=list(
#list('sp.polygons', spTransform(SE_sea1, CRS(newproj)),fill="white", first=F, col=NA),
#list('sp.polygons', spTransform(SE1, CRS(newproj)), alpha=1, lwd=2, first=F)),
xlim=c(613190.6,2173441),ylim=c(121319.4,1774699),col.regions=rainbow(29),colorkey=F,at=at+.Machine$double.eps,contour=T,labels=list(labels=format(at)),col=grey.colors(1),maxpixels=102300)
dev.off()
如果我将中断设置为=c(0,0.15,0.25,0.35,0.5),地图看起来会很完美,但由于我的原始数据集很大并且不可避免地会有与级别值相同的值,也许不超过 25575,而是 20-100 倍,我想将其减少到图像中显示的 5 倍以下。
我尝试添加:1) method="flattest"; 2) 列表('sp.pointLabel', r1, 标签, col='grey'); 3)列表("sp.text",坐标(raster_data),raster_data);但是 none 似乎适用于我的 RasterLayer,
任何建议将不胜感激,谢谢!
您可以将 .Machine$double.eps
添加到您的 at
值中,这样截断值就会错过 at 值。然后,您可以使用 labels
参数来调整显示的标签(因此您得到“0.1”而不是“0.100000e+02”)
spplot
的 labels
参数传递给 levelplot
(?sp
表示 ...
传递给 levelplot
(网格、多边形) 或 xyplot
(分),但 raster
是 "grid" 类型)。阅读 ?levelplot
说要查看 ?panel.levelplot
以获取有关 labels
参数的更多详细信息。最后,?panel.levelplot
表示 labels
可以是一个包含元素 "labels" 的列表,描述要放置在轮廓上的标签。
所以结果就是你的代码,除了:
- 调整
at
添加.Machine$double.eps
(小数)[=46=]
- 调整
label
以将标签指定为 "nice" 数字。
给予:
at <- c(0, 0.1, 0.15, 0.25, 0.35, 0.45)
spplot(r1, xlim=c(613190.6,2173441), ylim=c(121319.4,1774699),
col.regions=rainbow(4), colorkey=F, contour=T,
# add a small number to the colour cutoffs to prevent ties
at=at + .Machine$double.eps,
# change the labels to be "pretty". See `?format`
labels=list(labels=format(at)),
col=grey.colors(1), maxpixels=102300)
(颜色看起来很糟糕,但我想你可以从这里修复它:P)
我正在处理的数据每个级别都有很多相同的值(东南部 5 个州的每日降雨量),例如:
values(r1) <- c(rep(0.1,25575),rep(0.2,25575),rep(0.3,25575),rep(0.3,25575))
因此在输出图像中,每个级别的地图都充满了相同的label/value,有没有办法让每个级别的标签只显示一次或两次,例如:标签 0.1 只显示一次对于级别 1,不是 25575 次?
这里是测试代码:
library(sp)
library(rgdal)
library(raster)
library(maptools)
setwd("C:/Users/rosaR/Data/PRISM")
r1 <- raster(xmn=-88.77083, xmx=-75.02083, ymn=24.0625,ymx=36.97917, nrow=310, ncol=330,crs='+proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0')
#values(r1) <- c(rep(0.1,25575),rep(0.2,25575),rep(0.3,25575),rep(0.4,25575))
values(r1) <- c(rep(seq(from=0.1,to=3,by=0.1),3410))
newproj <- "+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs"
r1 <- projectRaster(r1, crs=newproj)
png(file=paste("test.png",sep=""), width=1350, height=700, units="px")
at=c(0,0.15,0.3,0.45,0.5,0.65,0.7,0.85,0.9,1.05,1.1,1.25,1.3,1.45,1.5,1.65,1.7,1.85,1.9,2.05,2.1,2.25,2.3,2.45,2.5,2.65,2.7,2.85,2.9,3)
spplot(r1,
#sp.layout=list(
#list('sp.polygons', spTransform(SE_sea1, CRS(newproj)),fill="white", first=F, col=NA),
#list('sp.polygons', spTransform(SE1, CRS(newproj)), alpha=1, lwd=2, first=F)),
xlim=c(613190.6,2173441),ylim=c(121319.4,1774699),col.regions=rainbow(29),colorkey=F,at=at+.Machine$double.eps,contour=T,labels=list(labels=format(at)),col=grey.colors(1),maxpixels=102300)
dev.off()
如果我将中断设置为=c(0,0.15,0.25,0.35,0.5),地图看起来会很完美,但由于我的原始数据集很大并且不可避免地会有与级别值相同的值,也许不超过 25575,而是 20-100 倍,我想将其减少到图像中显示的 5 倍以下。
我尝试添加:1) method="flattest"; 2) 列表('sp.pointLabel', r1, 标签, col='grey'); 3)列表("sp.text",坐标(raster_data),raster_data);但是 none 似乎适用于我的 RasterLayer,
任何建议将不胜感激,谢谢!
您可以将 .Machine$double.eps
添加到您的 at
值中,这样截断值就会错过 at 值。然后,您可以使用 labels
参数来调整显示的标签(因此您得到“0.1”而不是“0.100000e+02”)
spplot
的 labels
参数传递给 levelplot
(?sp
表示 ...
传递给 levelplot
(网格、多边形) 或 xyplot
(分),但 raster
是 "grid" 类型)。阅读 ?levelplot
说要查看 ?panel.levelplot
以获取有关 labels
参数的更多详细信息。最后,?panel.levelplot
表示 labels
可以是一个包含元素 "labels" 的列表,描述要放置在轮廓上的标签。
所以结果就是你的代码,除了:
- 调整
at
添加.Machine$double.eps
(小数)[=46=] - 调整
label
以将标签指定为 "nice" 数字。
给予:
at <- c(0, 0.1, 0.15, 0.25, 0.35, 0.45)
spplot(r1, xlim=c(613190.6,2173441), ylim=c(121319.4,1774699),
col.regions=rainbow(4), colorkey=F, contour=T,
# add a small number to the colour cutoffs to prevent ties
at=at + .Machine$double.eps,
# change the labels to be "pretty". See `?format`
labels=list(labels=format(at)),
col=grey.colors(1), maxpixels=102300)
(颜色看起来很糟糕,但我想你可以从这里修复它:P)