R语言如何移除filled.contour填充等高线图的颜色条
R语言移除filled.contour填充等高线图颜色条方法
该需求可以稳定实现。base R的filled.contour()默认通过内置的layout()规则将画布拆分为左右两栏:左侧为等高线主图,右侧预留约1/6宽度绘制颜色条,只要调整内置布局逻辑即可去掉冗余色条,不会影响主图的填充、等高线、坐标轴渲染效果。
方法一:自定义无颜色条版本函数(最稳定,一劳永逸)
原生filled.contour的色条宽度是源码内写死的,最稳妥的方式是复制源码做两处极小修改,得到和原生函数调用逻辑完全一致、但不带颜色条的版本:
- 将内置布局的色条栏宽度设为0,不再给色条预留绘图空间
- 移除原函数中绘制色条、色条标题的冗余代码
修改后的完整函数如下:
filled.contour_nokey <- function (x = seq(0, 1, length.out = nrow(z)), y = seq(0, 1, length.out = ncol(z)), z, nlevels = 20, levels = pretty(zlim, nlevels), zlim = range(z, finite = TRUE), col = heat.colors(nlevels), plot.title, plot.axes, asp = NA, xaxs = "i", yaxs = "i", las = 1, axes = TRUE, frame.plot = axes, ...) { if (missing(z)) { if (!missing(x)) { if (is.list(x)) { z <- x$z y <- x$y x <- x$x } else { z <- x x <- seq.int(0, 1, length.out = nrow(z)) } } else stop("no 'z' matrix specified") } else if (is.list(x)) { y <- x$y x <- x$x } if (any(diff(x) <= 0) || any(diff(y) <= 0)) stop("increasing 'x' and 'y' expected") # 修改布局:主图占满全部宽度,色条区域宽度设为0 layout(matrix(1, nrow=1)) par(mar = c(5,4,4,2) + 0.1) plot.new() plot.window(xlim = range(x, finite = TRUE), ylim = range(y, finite = TRUE), asp = asp, xaxs = xaxs, yaxs = yaxs, ...) .filled.contour(x, y, z, levels, col) if (missing(plot.axes)) { if (axes) { title(main = "", xlab = "", ylab = "") Axis(x, side = 1) Axis(y, side = 2) } } else { plot.axes } if (frame.plot) box() if (missing(plot.title)) title(...) else plot.title invisible() }
你原有的绘图代码不需要做任何逻辑修改,直接把函数名替换成filled.contour_nokey即可运行:
cols = heat.colors(100, rev = TRUE) filled.contour_nokey(volcano, nlevels = 100, col = cols, plot.axes = { axis(1) axis(2) contour(volcano, add = TRUE, lwd = 2, labcex = 1.2) box() })
方法二:临时遮罩法(快速出图用,不推荐批量使用)
如果只是临时出图不想修改函数,可以通过设置边距参数把色条挤到可视画布外,实现视觉上隐藏色条的效果。注意这种方法需要反复调试边距数值,容易出现主图比例变形:
cols = heat.colors(100, rev = TRUE) # 把右侧边距设为负值,将色条挤到画布外 par(oma = c(0,0,0,-2.5)) filled.contour(volcano, nlevels = 100, col = cols, plot.axes = { axis(1) axis(2) contour(volcano, add = TRUE, lwd = 2, labcex = 1.2) box() }) # 绘图结束后重置边距参数,避免影响后续绘图 par(oma = c(0,0,0,0))
注:如果不需要严格使用
filled.contour,也可以直接用image()做填充层+contour()加等高线的组合手动绘制,这种方式天生没有预留色条位置,灵活度更高。
内容的提问来源于stack exchange,提问作者JohnK
相关产品推荐
相关产品推荐

