绘图问题 - 图例比例尺、断点、图例、小数
Plot issues - legend bar scale, breaks, legend, decimals
我想绘制一堆栅格,我创建了一个代码来调整每个栅格的中断并通过 for 循环绘制它们。但是我遇到了一个有问题的颜色比例尺,我的努力并没有有效地解决这个问题。示例:
我的降水量在 0 到 11.000 之间……但大部分数据在 0 到 5.000 之间……很少有达到 11.000 的。所以我需要改变休息时间来捕捉这种变化……在我有更多数据的地方有更多的休息时间。
然后我为此创建了一个 breaks 对象。
但是当我绘制光栅时,比例颜色条变得糟糕,非常混乱......
#get predictors (These are a way lighter version of mine)
predictors_full<-getData('worldclim', var='bio', res=10)
predic_legends<-c(
"Annual Mean Temperature [°C*10]",
"Mean Diurnal Range [°C]",
"Isothermality",
"Temperature Seasonality [standard deviation]",
"Max Temperature of Warmest Month [°C*10]",
"Min Temperature of Coldest Month [°C*10]",
"Temperature Annual Range [°C*10]",
"Mean Temperature of Wettest Quarter [°C*10]",
"Mean Temperature of Driest Quarter [°C*10]",
"Mean Temperature of Warmest Quarter [°C*10]",
"Mean Temperature of Coldest Quarter [°C*10]",
"Annual Precipitation [mm/year]",
"Precipitation of Wettest Month [mm/month]",
"Precipitation of Driest Month [mm/month]",
"Precipitation Seasonality [coefficient of variation]",
"Precipitation of Wettest Quarter [mm/quarter]",
"Precipitation of Driest Quarter [mm/quarter]",
"Precipitation of Warmest Quarter [mm/quarter]",
"Precipitation of Coldest Quarter [mm/quarter]",
)
# Crop rasters and rename
xmin=-120; xmax=-35; ymin=-60; ymax=35
limits <- c(xmin, xmax, ymin, ymax)
predictors <- crop(predictors_full,limits)
predictor_names<-c("mT_annual","mT_dayn_rg","Isotherm","T_season",
"maxT_warm_M","minT_cold_M","rT_annual","mT_wet_Q","mT_dry_Q",
"mT_warm_Q","mT_cold_Q","P_annual","P_wet_M","P_dry_M","P_season",
"P_wet_Q","P_dry_Q","P_warm_Q","P_cold_Q")
names(predictors)<-predictor_names
#Set a palette
Blues_up<-c('#fff7fb','#ece7f2','#d0d1e6','#a6bddb','#74a9cf','#3690c0','#0570b0','#045a8d','#023858','#233159')
colfunc_blues<-colorRampPalette(Blues_up)
#Create a loop to plot all my Predictor rasters
for (i in 1:19) {
#save a figure
png(file=paste0(predictor_names[[i]],".png"),units="in", width=12, height=8.5, res=300)
#Define a plot area
par(mar = c(2,2, 3, 3), mfrow = c(1,1))
#extract values from rasters
vmax<- maxValue(predictors[[i]])
vmin<-minValue(predictors[[i]])
vmedn=(maxValue(predictors[[i]])-minValue(predictors[[i]]))/2
#breaks
break1<-c((seq(from=vmin,to= vmedn, length.out = 40)),(seq(from=(vmedn+(vmedn/5)),to=vmax,length.out = 5)))
#plot without the legend because the legend would come out with really messy, with too many marks and uneven spaces
plot(predictors[[i]], col =colfunc_blues(45) , breaks=break1, margin=FALSE,
main =predic_legends[i],legend.shrink=1)
dev.off()
}
此图是循环中所有栅格的 i=12
然后我写了一个不同的代码来为颜色条设置不同的中断
#Plot the raster with no color scale bar
plot(predictors[[i]], col =colfunc_blues(45) , breaks=break1, margin=FALSE,
main =predic_legends[i],legend=FALSE)
#breaks for the color scale
def_breaks = seq(vmax,vmin,length.out=(10))
#plot only the legend
image.plot(predictors_full[[i]], zlim = c(vmin,vmax),
legend.only = TRUE, col = colfunc_greys(30),
axis.args = list(at = def_breaks, labels =def_breaks,cex.axis=0.5))
但这行不通,因为颜色与地图中的数字并不完全匹配...请看每张地图中 6.000 的颜色...不同。
关于如何进行的任何提示?
我是 R 的新手,所以我很努力地实现我的目标......
另外,我的数字中有很多小数位...如何将其更改为 2 位小数?
编辑:@jbaums 教我使用日志...我喜欢,但还不是我想要的
levelplot(predictors[[12]]+1, col.regions=colorRampPalette(brewer.pal(9, 'Blues')), zscaleLog=TRUE, at=seq(1, 4, len=100), margin=FALSE)
您可以使用 classInt
包中的 classIntervals()
函数来避免对数刻度(正如某些用户所说)。
使用levelplot()
(我认为结果优于raster::plot()
函数):
# Normal breaks
break1 <- classIntervals(predictors[[12]][!is.na(predictors[[12]])], n = 50, style = "equal")
levelplot(predictors[[12]], col.regions=colorRampPalette(brewer.pal(9, 'Blues')), at=break1$brks, margin=FALSE,main =predic_legends[12])
# Using quantiles
break1 <- classIntervals(predictors[[12]][!is.na(predictors[[12]])], n = 50, style = "quantile")
levelplot(predictors[[12]], col.regions=colorRampPalette(brewer.pal(9, 'Blues')), at=break1$brks, margin=FALSE,main =predic_legends[12])
此外,您还有更多选择,例如sd
、pretty
、kmeans
、hclust
等。
添加多边形并指向绘图
首先,我将把上面的图保存到p
,对于这个例子来说这条线太长了:
p <- levelplot(predictors[[12]], col.regions=colorRampPalette(brewer.pal(9, 'Blues')), at=break1$brks, margin=FALSE,main =predic_legends[12])
我将使用与您 wrld_simpl
数据相同的数据作为要添加到图中的多边形,我将创建要添加到图中的点。
library(maptools)
library(rgeos)
data(wrld_simpl)
pts <- gCentroid(wrld_simpl, byid = T)
要添加线、多边形、点甚至文本,您可以使用 layer()
函数和一个 panel.spplot
对象:
p + layer(sp.polygons(wrld_simpl)) + layer(sp.points(pts))
最后,您还可以更改颜色、填充、符号系统等:
p + layer(sp.polygons(wrld_simpl,col='firebrick')) + layer(sp.points(pts,pch = 12,col='red'))
查看 ?panel.spplot
了解更多信息。
我想绘制一堆栅格,我创建了一个代码来调整每个栅格的中断并通过 for 循环绘制它们。但是我遇到了一个有问题的颜色比例尺,我的努力并没有有效地解决这个问题。示例:
我的降水量在 0 到 11.000 之间……但大部分数据在 0 到 5.000 之间……很少有达到 11.000 的。所以我需要改变休息时间来捕捉这种变化……在我有更多数据的地方有更多的休息时间。
然后我为此创建了一个 breaks 对象。
但是当我绘制光栅时,比例颜色条变得糟糕,非常混乱......
#get predictors (These are a way lighter version of mine)
predictors_full<-getData('worldclim', var='bio', res=10)
predic_legends<-c(
"Annual Mean Temperature [°C*10]",
"Mean Diurnal Range [°C]",
"Isothermality",
"Temperature Seasonality [standard deviation]",
"Max Temperature of Warmest Month [°C*10]",
"Min Temperature of Coldest Month [°C*10]",
"Temperature Annual Range [°C*10]",
"Mean Temperature of Wettest Quarter [°C*10]",
"Mean Temperature of Driest Quarter [°C*10]",
"Mean Temperature of Warmest Quarter [°C*10]",
"Mean Temperature of Coldest Quarter [°C*10]",
"Annual Precipitation [mm/year]",
"Precipitation of Wettest Month [mm/month]",
"Precipitation of Driest Month [mm/month]",
"Precipitation Seasonality [coefficient of variation]",
"Precipitation of Wettest Quarter [mm/quarter]",
"Precipitation of Driest Quarter [mm/quarter]",
"Precipitation of Warmest Quarter [mm/quarter]",
"Precipitation of Coldest Quarter [mm/quarter]",
)
# Crop rasters and rename
xmin=-120; xmax=-35; ymin=-60; ymax=35
limits <- c(xmin, xmax, ymin, ymax)
predictors <- crop(predictors_full,limits)
predictor_names<-c("mT_annual","mT_dayn_rg","Isotherm","T_season",
"maxT_warm_M","minT_cold_M","rT_annual","mT_wet_Q","mT_dry_Q",
"mT_warm_Q","mT_cold_Q","P_annual","P_wet_M","P_dry_M","P_season",
"P_wet_Q","P_dry_Q","P_warm_Q","P_cold_Q")
names(predictors)<-predictor_names
#Set a palette
Blues_up<-c('#fff7fb','#ece7f2','#d0d1e6','#a6bddb','#74a9cf','#3690c0','#0570b0','#045a8d','#023858','#233159')
colfunc_blues<-colorRampPalette(Blues_up)
#Create a loop to plot all my Predictor rasters
for (i in 1:19) {
#save a figure
png(file=paste0(predictor_names[[i]],".png"),units="in", width=12, height=8.5, res=300)
#Define a plot area
par(mar = c(2,2, 3, 3), mfrow = c(1,1))
#extract values from rasters
vmax<- maxValue(predictors[[i]])
vmin<-minValue(predictors[[i]])
vmedn=(maxValue(predictors[[i]])-minValue(predictors[[i]]))/2
#breaks
break1<-c((seq(from=vmin,to= vmedn, length.out = 40)),(seq(from=(vmedn+(vmedn/5)),to=vmax,length.out = 5)))
#plot without the legend because the legend would come out with really messy, with too many marks and uneven spaces
plot(predictors[[i]], col =colfunc_blues(45) , breaks=break1, margin=FALSE,
main =predic_legends[i],legend.shrink=1)
dev.off()
}
然后我写了一个不同的代码来为颜色条设置不同的中断
#Plot the raster with no color scale bar
plot(predictors[[i]], col =colfunc_blues(45) , breaks=break1, margin=FALSE,
main =predic_legends[i],legend=FALSE)
#breaks for the color scale
def_breaks = seq(vmax,vmin,length.out=(10))
#plot only the legend
image.plot(predictors_full[[i]], zlim = c(vmin,vmax),
legend.only = TRUE, col = colfunc_greys(30),
axis.args = list(at = def_breaks, labels =def_breaks,cex.axis=0.5))
但这行不通,因为颜色与地图中的数字并不完全匹配...请看每张地图中 6.000 的颜色...不同。
关于如何进行的任何提示? 我是 R 的新手,所以我很努力地实现我的目标...... 另外,我的数字中有很多小数位...如何将其更改为 2 位小数?
编辑:@jbaums 教我使用日志...我喜欢,但还不是我想要的
levelplot(predictors[[12]]+1, col.regions=colorRampPalette(brewer.pal(9, 'Blues')), zscaleLog=TRUE, at=seq(1, 4, len=100), margin=FALSE)
您可以使用 classInt
包中的 classIntervals()
函数来避免对数刻度(正如某些用户所说)。
使用levelplot()
(我认为结果优于raster::plot()
函数):
# Normal breaks
break1 <- classIntervals(predictors[[12]][!is.na(predictors[[12]])], n = 50, style = "equal")
levelplot(predictors[[12]], col.regions=colorRampPalette(brewer.pal(9, 'Blues')), at=break1$brks, margin=FALSE,main =predic_legends[12])
# Using quantiles
break1 <- classIntervals(predictors[[12]][!is.na(predictors[[12]])], n = 50, style = "quantile")
levelplot(predictors[[12]], col.regions=colorRampPalette(brewer.pal(9, 'Blues')), at=break1$brks, margin=FALSE,main =predic_legends[12])
此外,您还有更多选择,例如sd
、pretty
、kmeans
、hclust
等。
添加多边形并指向绘图
首先,我将把上面的图保存到p
,对于这个例子来说这条线太长了:
p <- levelplot(predictors[[12]], col.regions=colorRampPalette(brewer.pal(9, 'Blues')), at=break1$brks, margin=FALSE,main =predic_legends[12])
我将使用与您 wrld_simpl
数据相同的数据作为要添加到图中的多边形,我将创建要添加到图中的点。
library(maptools)
library(rgeos)
data(wrld_simpl)
pts <- gCentroid(wrld_simpl, byid = T)
要添加线、多边形、点甚至文本,您可以使用 layer()
函数和一个 panel.spplot
对象:
p + layer(sp.polygons(wrld_simpl)) + layer(sp.points(pts))
最后,您还可以更改颜色、填充、符号系统等:
p + layer(sp.polygons(wrld_simpl,col='firebrick')) + layer(sp.points(pts,pch = 12,col='red'))
查看 ?panel.spplot
了解更多信息。