使用Viridis、ggplot2与ggmarginal绘制带配色的Bland-Altman图问题
解决Bland-Altman图的Viridis配色与ggMarginal连续密度图问题
我来帮你调整代码,实现按A1_video或A1_phones的数值给点分配连续Viridis配色,同时搭配对应的连续密度边际图:
第一步:整理数据(更规范的列名)
先把数据框的列名改得清晰易懂,避免在ggplot里反复使用a1$:
# 计算差值相关变量 diff <- a1$A1_phones - a1$A1_video diffp <- (a1$A1_phones - a1$A1_video)/a1$A1_video*100 sd.diff <- sd(diff) sd.diffp <- sd(diffp) # 构建规范的数据框 my.data <- data.frame( video = a1$A1_video, phones = a1$A1_phones, diff = diff, diffp = diffp )
第二步:绘制带连续Viridis配色的Bland-Altman主图
这里我们把点的颜色映射到video(你也可以换成phones)的连续数值,用scale_color_viridis_c()实现Viridis连续配色,同时优化坐标轴范围避免截断数据:
diffplot <- ggplot(my.data, aes(x = video, y = diff)) + # 把颜色映射到video的连续值,设置透明度避免点重叠 geom_point(aes(colour = video), size = 2, alpha = 0.5) + theme_bw() + # 用coord_cartesian替代ylim,仅调整显示范围不过滤数据 coord_cartesian(ylim = c(mean(diff) - 7*sd.diff, mean(diff) + 7*sd.diff)) + # 添加Bland-Altman的参考线 geom_hline(yintercept = 0, linetype = 3) + geom_hline(yintercept = mean(diff)) + geom_hline(yintercept = mean(diff) + 2*sd.diff, linetype = 2) + geom_hline(yintercept = mean(diff) - 2*sd.diff, linetype = 2) + # 设置标签和图例名称 labs( y = "Difference Video vs Algorithm [ms]", x = "Average of Video vs Algorithm [ms]", colour = "Video Measurement [ms]" ) + # 应用Viridis连续配色方案,option可选"viridis"/"plasma"/"magma"等 scale_color_viridis_c(option = "viridis")
第三步:添加Viridis配色的连续密度边际图
把ggMarginal的类型改成"density"实现连续密度图,同时用Viridis颜色填充,保证和主图配色风格统一:
library(viridis) p <- ggMarginal(diffplot, type = "density", # 用Viridis渐变填充密度图,alpha调整透明度 fill = viridis(100, option = "viridis"), colour = "white", # 密度图边框设为白色提升可读性 alpha = 0.7) p
关键改动说明
- 颜色映射逻辑:将点的颜色绑定到
video/phones的连续数值,用scale_color_viridis_c()替代你原来的离散型配色,完美适配连续变量的配色需求。 - 坐标轴优化:用
coord_cartesian替代ylim,避免过滤掉超出显示范围的点,这对Bland-Altman图的完整性很重要。 - 边际图适配:将边际图类型从直方图改为密度图,并用Viridis渐变填充,和主图的配色风格保持一致,实现视觉统一。
如果需要把颜色映射到phones,只需要把aes(colour = video)改成aes(colour = phones),同时调整图例名称即可。
内容的提问来源于stack exchange,提问作者Claudio
相关产品推荐
相关产品推荐

