如何在ggplot中按(x,y)点出现次数增大散点尺寸?
解决方案
一、修改代码实现点尺寸随出现次数增大
由于x和y均为0-2的整数,本质是9种离散组合,直接统计每个组合的出现频次,再将频次映射为点大小会更高效,同时精准匹配你的需求。修改后的代码如下:
library(scattermore) library(ggplot2) library(dplyr) # 初始化空数据框存储所有(x,y)对 all_pairs <- data.frame(query = integer(), sup = integer()) for (i in 1:6){ query <- exp_df[[i,1]] sup <- exp_df[[i,2]] query_path <- paste0(query,".sscore.csv") sup_path <- paste0(sup,".sscore%0D.csv") # 读取并合并两文件的第4列数据 shell_command <- sprintf("/bin/bash -c 'paste -d, <(cut -d, -f4 %s) <(cut -d, -f4 %s)'", query_path, sup_path) count_pairs <- system(shell_command, intern = TRUE) # 转换为整数型数据框 current_pairs <- read.table(text = count_pairs, sep = ",", header = TRUE, col.names=c("query", "sup")) %>% mutate(across(c(query, sup), as.integer)) # 合并到总数据框 all_pairs <- bind_rows(all_pairs, current_pairs) } # 统计每个(x,y)组合的出现次数 pair_counts <- all_pairs %>% count(query, sup, name = "frequency") # 绘制散点图,点大小关联出现频次 gg <- ggplot(pair_counts) + geom_scattermost(aes(x = query, y = sup, size = frequency), pixels = c(700,700)) + scale_size_continuous(range = c(1, 6)) # 可根据需求调整点大小范围 gg
代码说明:
- 先收集所有迭代的(x,y)对,避免重复绘图叠加
- 用
dplyr::count()统计频次,比逐次画散点更高效,适配大样本量 - 通过
aes(size = frequency)让点大小直接关联出现次数,用scale_size_continuous控制大小区间
二、适合大样本量的替代绘图方案
针对离散二维组合的频次展示,除散点图外还有以下更直观的选择:
热图(Heatmap):用颜色深浅表示频次,清晰展示各组合的分布差异
ggplot(pair_counts, aes(x = query, y = sup, fill = frequency)) + geom_tile(color = "white") + scale_fill_gradient(low = "lightblue", high = "darkblue") + theme_minimal()气泡图(Bubble Plot):结合点大小与颜色双重映射频次,视觉冲击力更强(仅9个离散点,用
geom_point足够高效)ggplot(pair_counts, aes(x = query, y = sup, size = frequency, color = frequency)) + geom_point(alpha = 0.8) + scale_size_continuous(range = c(5, 15)) + scale_color_gradient(low = "orange", high = "red") + theme_bw()马赛克图(Mosaic Plot):直观展示各组合的占比关系,适合分类变量的联合分布分析
library(vcd) mosaic(table(all_pairs$query, all_pairs$sup), shade = TRUE, legend = TRUE)
内容的提问来源于stack exchange,提问作者Caterina
相关产品推荐
相关产品推荐

