使用ggplot2 stat_density_2d(数值求和而非计数)绘制密度图及偏差分析
没问题,我来帮你一步步实现这个需求!下面是具体的R代码和思路说明:
第一步:数据聚合计算偏差值
首先我们需要把重复的(X,Y)坐标点聚合起来,计算每个点的响应总和(也就是你说的整体偏差)。这里用dplyr来做数据处理会很方便:
# 加载需要的包 library(dplyr) library(ggplot2) # 假设你的数据集叫df,X/Y坐标列名为x_pos、y_pos,响应列名为response # 聚合每个坐标点的响应总和 aggregated_data <- df %>% group_by(x_pos, y_pos) %>% summarize(total_deviation = sum(response), .groups = "drop")
这里的total_deviation就是每个坐标点的整体偏差:如果总和为正,说明该位置“是”的响应更多;总和为负则“否”的响应占主导。
第二步:绘制加权的2D密度图
默认的stat_density_2d是按点的计数来计算密度的,我们需要通过weight参数指定用total_deviation作为权重,这样密度统计就基于数值求和而非点的数量了:
ggplot(aggregated_data, aes(x = x_pos, y = y_pos)) + # 用填充多边形展示密度,weight参数指定加权依据 stat_density_2d( aes(fill = stat(density), weight = total_deviation), geom = "polygon", alpha = 0.7 # 调整透明度,避免图层重叠遮挡 ) + # 用viridis颜色渐变,可读性更好 scale_fill_viridis_c(option = "plasma", name = "加权密度") + # 添加标题和坐标轴标签 labs( x = "测试图像X坐标", y = "测试图像Y坐标", title = "基于响应偏差的2D密度分布图" ) + # 用简洁的主题 theme_minimal()
额外调整建议
- 如果你想要展示等高线而非填充区域,可以把
geom = "polygon"改成geom = "contour",还可以同时添加填充和等高线来增强可视化效果; - 如果你的列名和示例不一样,记得把代码里的
x_pos、y_pos、response替换成你数据集里的实际列名; - 可以调整
scale_fill_viridis_c里的option参数切换颜色方案,比如"magma"、"inferno"都是不错的选择。
内容的提问来源于stack exchange,提问作者Braham Hughes
相关产品推荐
相关产品推荐

