问题:绘图问题-图例条比例尺、间断点、图例、小数位数

6
我想绘制一堆栅格图像,并创建了一个代码来调整每个图像的间断点并通过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()
}

根据上述代码生成的降水栅格图

接着,我编写了另一段代码来设置颜色条的不同断点。

#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的颜色...它们是不同的。

Different breaks for plot and scale

有关如何进行操作,你有什么建议吗? 我是R的新手,所以我很难达到我的目标...... 另外,数字中有很多小数位......如何将其更改为2个小数位?

编辑:@jbaums教我使用对数......我喜欢但还不是我寻求的

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

Using log


你实际上想让它看起来像什么? - jbaums
1
我不希望颜色在数字上均匀分布,因为我在高和低数字上的数据很少,而在中间的数据很多。如果它们是均匀分布的话,我的图像几乎没有浅蓝色和深蓝色,而且全部都是"中蓝色",只有很少的蓝色变化。我希望一个极端使用浅蓝色,另一个极端使用深蓝色,并且在确实存在数据的地方,其他蓝色根据数据的情况进行渐变。我发布的代码是我尝试做到这一点的努力...但我才接触编程和R语言一个月...我缺乏基础,尽管我一直在阅读大量资料。 - Thai
@jbaums... 你理解这个解释了吗?如果我表达不够清晰,请告诉我,我会尽力改进!非常感谢你的关注! - Thai
2
你可以尝试使用对数刻度。例如:library(rasterVis); library(RColorBrewer); levelplot(predictors[[12]]+1, col.regions=colorRampPalette(brewer.pal(9, 'Blues')), zscaleLog=TRUE, at=seq(1, 4, len=100), margin=FALSE) - jbaums
谢谢@jbaums...我真的很喜欢学习这种可能性!但我会继续尝试其他选项,因为使用日志会失去比例尺中降水量的简单信息,尽管我可以看到哪里下雨更多。 - Thai
1个回答

5
你可以使用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])

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

在此输入图片描述

另外,您可以选择更多选项,例如sdprettykmeanshclust等。


向绘图中添加多边形和点

首先,我将保存上面的图形到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 获取更多信息。


哦,我的天啊!好的达尔文!正是我需要的!@aldo_tapia,非常感谢!!! - Thai
levelplot 确实比 plot 产生更好的结果...但是我上个月才接触 R,因此我仍在学习,并且我在使用 levelplot 时遇到了一些问题,因为我总是在同一张地图上绘制栅格、wrld_simpl 中的国家线、spatialPoints 和多边形...用普通的 plot 很容易,我只需要对我想要绘制的所有内容执行 plot(x, add=TRUE)...但是用 levelplot 就不同了。但我会尽快花时间学习 levelplot 和 ggplot!非常感谢,@aldo_tapia - Thai
1
@Thai 让我来帮助你。我现在离我的电脑很远,但我会尽快完善我的回答。 - aldo_tapia
我已经在使用和探索你教给我的一切!谢谢,@aldo_tapia !!! - Thai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接