R base绘图如何按坐标点出现频次调整对应散点大小
Base R 实现散点尺寸匹配坐标点出现频次的方案
核心逻辑:先统计每个(X,Y)唯一坐标对的出现次数,将次数映射给plot函数的cex参数(控制点大小),替代原始逐点绘制的逻辑,解决重叠点无法区分频次的问题。
操作步骤
- 统计坐标点频次
先用base R内置函数统计两个变量所有组合的出现次数,过滤掉不存在的坐标组合:
# 构建坐标数据框 coord_data <- data.frame( X = survey$Q24, Y = survey$Q7 ) # 统计每个坐标对的频次 coord_freq <- as.data.frame(table(coord_data)) # 将坐标从因子类型转回数值型 coord_freq$X <- as.numeric(as.character(coord_freq$X)) coord_freq$Y <- as.numeric(as.character(coord_freq$Y)) # 移除频次为0的无效坐标组合 coord_freq <- coord_freq[coord_freq$Freq > 0, ]- 统计坐标点频次
- 绘制频次映射尺寸的散点图
把频次乘以合适的缩放系数传给cex参数,缩放系数可根据样本量调整,保证点大小视觉舒适:
plot( x = coord_freq$X, y = coord_freq$Y, main = "X vs. Y", xlab = "X", ylab = "Y", pch = 20, bty = "l", xlim = c(1, 5), # 固定X轴范围为1-5 ylim = c(1, 5), # 固定Y轴范围为1-5 cex = coord_freq$Freq * 0.3 # 核心参数:点大小和频次正相关,0.3为缩放系数可按需调整 ) # 可选:添加频次大小对照图例 legend( "topright", title = "点位出现频次", legend = c(1, 5, 10, 20), # 替换为自身数据的实际频次区间 pch = 20, cex = c(1, 5, 10, 20) * 0.3, bty = "n" )- 绘制频次映射尺寸的散点图
测试验证
用给出的前6条样本数据测试:
- Q7前6条值:
c(5, 5, 4, 4, 5, 5) - Q24前6条值:
c(1, 1, 1, 2, 1, 1)
统计后得到:(X=1,Y=5)共出现4次(点最大),(X=1,Y=4)、(X=2,Y=4)各出现1次(点最小),完全符合频次映射点尺寸的需求。
提示:如果点大小视觉效果不合适,直接调整
cex参数里的缩放系数即可,总样本量越大系数取值越小,避免最大的点超出绘图区域。
内容的提问来源于stack exchange,提问作者Finn Murdoch
相关产品推荐
相关产品推荐

