R语言plot()绘RasterLayer时加breaks参数图例出现空白问题
问题原因
你遇到的图例空白问题由两个核心错误导致:
- breaks参数定义语法错误:
seq(-0.1:0.4,0.45,0.1)不符合R的seq函数规范,R中冒号运算优先级更高,-0.1:0.4会先生成一个长度为6的数值向量作为seq的第一个参数,最终生成的断点序列完全不符合你的预期,长度也和配色数量不匹配。 - 规则不匹配:自定义分段时,配色数量必须等于breaks长度减1;当你设置的breaks范围大于栅格实际数值范围时,raster的plot函数默认会自动拉伸图例,就会出现上下空白区域。
解决方案
按以下步骤修改代码即可解决问题:
- 第一步:修正breaks的定义,匹配配色数量
你需要的是从-0.1开始步长0.1的分段,7个配色需要对应8个断点,正确写法如下:
# 生成8个断点,正好匹配7个颜色的分段需求 lnd <- seq(from = -0.1, to = 0.6, by = 0.1) # 如果你的栅格实际最大值不到0.45,可根据实际极值调整to参数,让断点范围和栅格数值范围匹配
- 第二步:修改plot调用代码,添加参数限制图例规则
pallete <- brewer.pal(7,"YlGn") lnd <- seq(from = -0.1, to = 0.6, by = 0.1) Land_JUNE <- plot(Land_JUNE, breaks = lnd, col = pallete, zlim = range(lnd), # 强制绘图数值范围和断点范围一致 axes=F, frame.plot=FALSE, box = FALSE, boundary.plot=FALSE, bty="n", legend.args = list(text='Land_JUNE'), axis.args = list(at = lnd, labels = lnd), # 强制图例刻度和断点完全对齐 legend.shrink = 1 # 图例拉伸到全高度,消除上下空白 ) plot(bb_poly, main="IN JUNE",add=T) plot(coastline ,add=T)
- 第三步:适配实际栅格范围
如果调整后还有空白,运行minValue(Land_JUNE)和maxValue(Land_JUNE)查看栅格实际极值,把breaks的上下限调整到和实际极值匹配即可。
内容的提问来源于stack exchange,提问作者Adib Khondoker
相关产品推荐
相关产品推荐

