在R中为NetCDF多面板图色条添加阈值上下的三角形端点
给NetCDF多面板绘图色条添加三角端点(基于poly.image实现)
核心思路是通过自定义色条的多边形顶点,把色条的上下端扩展为三角形,再用poly.image绘制带三角的色条,对应超出阈值的数值范围。
步骤与示例代码
1. 准备数据与基础参数
先读取NetCDF月值数据,设定色条的阈值范围:
library(ncdf4) library(fields) # 读取NetCDF文件(12层月值数据) nc <- nc_open("monthly_data.nc") var_data <- ncvar_get(nc, "target_variable") # 替换为你的变量名 nc_close(nc) # 设定色条阈值与三角尺寸 vmin <- -2 # 下限阈值 vmax <- 2 # 上限阈值 tri_height <- 0.2 # 三角的高度,可根据绘图区域调整
2. 构建带三角的色条多边形
以垂直色条为例,定义色条位置后,拼接底部三角、色条主体、顶部三角的顶点坐标:
# 定义垂直色条的位置(右侧区域) bar_x_left <- 10.5 bar_x_right <- 11 bar_x_mid <- (bar_x_left + bar_x_right) / 2 # 构建完整的多边形顶点矩阵 poly_vertices <- rbind( # 底部三角部分 c(bar_x_left, vmin), c(bar_x_right, vmin), c(bar_x_mid, vmin - tri_height), c(bar_x_left, vmin), # 色条主体部分 c(bar_x_left, vmax), c(bar_x_right, vmax), # 顶部三角部分 c(bar_x_mid, vmax + tri_height), c(bar_x_left, vmax) )
3. 绘制多面板图与自定义色条
先绘制12个月的多面板图,再用poly.image叠加带三角的色条:
# 绘制多面板(3行4列) par(mfrow = c(3, 4), mar = c(2, 2, 2, 4)) for (month in 1:12) { image.plot(var_data[,,month], zlim = c(vmin, vmax), axes = FALSE, legend.only = FALSE, main = month.name[month]) } # 叠加自定义色条 par(new = TRUE, mar = c(0, 0, 0, 0)) # 构建对应数值序列(包含三角的虚拟值) z_seq <- c(vmin - 1, seq(vmin, vmax, length.out = 100), vmax + 1) # 构建完整颜色序列(三角用色条两端颜色) color_pal <- colorRampPalette(c("darkblue", "white", "darkred"))(100) full_colors <- c(color_pal[1], color_pal, color_pal[100]) # 用poly.image绘制带三角的色条 poly.image(poly_vertices, z = z_seq, col = full_colors, breaks = c(vmin - 1, seq(vmin, vmax, length.out = 100), vmax + 1)) # 可选:给三角添加阈值标签 text(bar_x_mid, vmin - tri_height, labels = paste("<", vmin), adj = 0.5) text(bar_x_mid, vmax + tri_height, labels = paste(">", vmax), adj = 0.5)
注意事项
- 如果需要水平色条,只需调整顶点的x、y方向:把三角放在色条的左右两端,修改顶点的x坐标扩展即可。
tri_height的数值需要根据绘图的坐标范围调整,避免三角过大或过小。- 颜色序列要和数值序列对应,确保超出阈值的三角部分使用色条的端点颜色。
内容的提问来源于stack exchange,提问作者Maria Chara Karypidou
相关产品推荐
相关产品推荐

