如何制作高区分度热图:解决极值干扰下的数值辨识度问题
解决lattice热图颜色区分度问题的几种方法
针对底部行数值偏低导致其他区域颜色难以区分的问题,可以通过以下几种方式调整:
1. 基于分位数设置颜色断点
利用分位数将数值区间划分为更均衡的分段,让高数值区域的颜色差异更明显:
library("lattice") n <- (1:10)*10 Dynamic_n <- (1:10)*10 data <- expand.grid(X=n, Y=Dynamic_n) results <- c(0.74, 0.648, 0.544, 0.457, 0.406, 0.344, 0.327, 0.278, 0.277, 0.232, 0.87, 0.913, 0.919, 0.898, 0.873, 0.839, 0.8, 0.754, 0.703, 0.64, 0.889, 0.927, 0.952, 0.949, 0.93, 0.935, 0.918, 0.9, 0.909, 0.875, 0.871, 0.925, 0.951, 0.958, 0.954, 0.959, 0.958, 0.949, 0.933, 0.94, 0.876, 0.952, 0.944, 0.955, 0.973, 0.965, 0.963, 0.964, 0.968, 0.971, 0.871, 0.932, 0.956, 0.961, 0.955, 0.97, 0.964, 0.973, 0.971, 0.969, 0.887, 0.938, 0.958, 0.974, 0.968, 0.959, 0.967, 0.974, 0.97, 0.966, 0.881, 0.944, 0.961, 0.954, 0.966, 0.961, 0.958, 0.965, 0.979, 0.971, 0.878, 0.927, 0.954, 0.966, 0.967, 0.953, 0.959, 0.973, 0.976, 0.969, 0.868, 0.932, 0.952, 0.965, 0.964, 0.97, 0.964, 0.976, 0.966, 0.974) data$results <- results # 计算分位数断点 breaks <- quantile(data$results, seq(0, 1, length.out = 15)) # 使用分位数断点绘制热图 levelplot(results ~ X*Y, data = data, xlab="X", main="", at = breaks, col.regions = colorRampPalette(c("#0000FF", "#FFFFFF", "#FF0000"))(14))
2. 截断极端低值并调整颜色映射范围
如果底部行的低值属于异常或次要数据,可以截断数值范围,聚焦高数值区域的区分度,同时保留低值的标识:
# 截断数值,将低于0.6的数值设为0.6(仅用于颜色映射) data$results_adj <- pmax(data$results, 0.6) # 绘制调整后的热图,同时可以添加注释说明截断情况 levelplot(results_adj ~ X*Y, data = data, xlab="X", main="热图(数值低于0.6统一按0.6映射)", col.regions = colorRampPalette(c("blue", "white", "red"))(20))
3. 使用感知均匀的颜色方案
选择对人眼更友好的颜色渐变(如viridis系列),即使数值范围差异大,也能更好区分相近数值:
# 需要先安装viridis包 # install.packages("viridis") library(viridis) levelplot(results ~ X*Y, data = data, xlab="X", main="", col.regions = viridis(20), at = seq(min(data$results), max(data$results), length.out = 21))
4. 自定义颜色区间
手动划分颜色区间,给高数值区域分配更多的颜色分段:
# 手动设置断点,低值区间宽,高值区间密 custom_breaks <- c(0.2, 0.6, 0.8, 0.85, 0.9, 0.92, 0.94, 0.96, 0.98) levelplot(results ~ X*Y, data = data, xlab="X", main="", at = custom_breaks, col.regions = colorRampPalette(c("darkblue", "lightblue", "yellow", "orange", "red"))(length(custom_breaks)-1))
内容的提问来源于stack exchange,提问作者J.Z.
相关产品推荐
相关产品推荐

