2017-08-06 69 views
3

我想绘制一堆栅格,并且我创建了一个代码来调整每个节点的断点并将它们绘制到一个for循环中。但是我得到了一个有问题的色彩比例尺,我的努力并没有有效解决这个问题。例如:绘图问题 - 传奇小节刻度,休息时间,图例,小数点

我的降水量范围从0到11.000 ...但大部分数据在0到5.000之间......很少有到11.000。所以我需要改变休息时间来捕捉这种变化...更多的休息时间,我有更多的数据。

然后我为此创建了一个休息对象。
但是,当我绘制光栅,规模彩条变得可怕,很凌乱......

#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() 
} 

Precipitation raster according to the above code 这个数字是在循环

的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 ...这是d ifferent。

Different breaks for plot and scale

如何上进行任何提示? 我是新来的R,所以我很努力达到我的目标...... 另外,我在数字中得到了很多小数位数......如何改变小数点后两位?

编辑:@jbaums教我用日志...我很喜欢,但它没有我所追求

levelplot(predictors[[12]]+1, col.regions=colorRampPalette(brewer.pal(9, 'Blues')), zscaleLog=TRUE, at=seq(1, 4, len=100), margin=FALSE) 

Using log

+0

你究竟想要它看起来像什么? – jbaums

+0

我不希望沿着数字平均分配的颜色,因为我有很少的数据在高和低的数字,太多在中间......如果他们平均分布,我得到一个几乎没有光和深蓝色的地图,和一切将会是“中等蓝色”,而蓝色变化很少。我想要一个极端的浅蓝色,另一个极端的一个深蓝色,以及确实有数据的数据的其余蓝色。我发布的代码是我尝试这么做的......但上个月我被介绍给编程和R ...我缺乏基础,虽然我一直在阅读很多 – Thai

+0

@jbaums ...你明白这个解释吗?请让我知道如果我不够清楚,我会尽力做得更好!提前感谢您的关注! – Thai

回答

1

你能避免对数比例(如一些网友说你)使用classIntervals()功能从classInt包。

使用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]) 

enter image description here

# 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]) 

enter image description here

而且,你有更多的选项可供选择,如sd,prettykmeans,hclust等。


添加多边形点的情节

首先,我将保存以上p的情节,该行是在这个例子太长时间:

p <- levelplot(predictors[[12]], col.regions=colorRampPalette(brewer.pal(9, 'Blues')), at=break1$brks, margin=FALSE,main =predic_legends[12]) 

我将使用与你的数据相同的数据,作为多边形添加到图中,我将创建要添加到图的点。

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

enter image description here

最后,你也可以改变颜色,填充,符号等等:

p + layer(sp.polygons(wrld_simpl,col='firebrick')) + layer(sp.points(pts,pch = 12,col='red')) 

enter image description here

检查?panel.spplot了解更多信息。

+0

哦我的!好达尔文!正是我需要的! @aldo_tapia,muito obrigada !!! – Thai

+0

levelplot确实产生了更好的结果,然后情节...但我上个月被介绍给R,因此我仍然在学习,并且我有一些麻烦在levelplot上添加另一个情节,因为我总是在同一个地图上绘制一个光栅,对于来自wrld_simpl,spatialPoints和多边形的国家来说,线条很容易,我只是对所有我想要绘制的东西进行'plot(x,add = TRUE)...与levelplot不同。但我会尽可能快地学习levelplot和ggplot!非常感谢,@aldo_tapia – Thai

+0

@Thai让我帮你。我现在远离我的机器,但我会尽快改进我的答案 –