如何在R中缩小ComplexUpset生成的EPS/SVG格式图形文件大小?
解决ComplexUpset生成的EPS/SVG体积过大问题
你的核心问题是用1000万行原始数据直接绘图,导致矢量文件嵌入了所有冗余数据点——但upset图只需要展示汇总后的交集统计,根本不需要保留原始数据。以下是几个实用的解决办法:
1. 提前计算汇总统计,用精简数据绘图
手动算出所有需要展示的交集计数、集合大小,再用这些汇总数据生成upset图,彻底砍掉冗余数据:
library(dplyr) library(tidyr) # 计算每个交集的计数(仅保留至少2个集合的交集) intersection_stats <- M1_BinaryMatrix %>% group_by(across(everything())) %>% summarise(count = n(), .groups = "drop") %>% rowwise() %>% mutate(degree = sum(c_across(everything()))) %>% filter(degree >= 2) %>% ungroup() %>% mutate(ratio = count / nrow(M1_BinaryMatrix)) # 计算每个集合的大小 set_sizes <- M1_BinaryMatrix %>% summarise(across(everything(), sum)) %>% pivot_longer(everything(), names_to = "set", values_to = "count") %>% mutate(ratio = count / nrow(M1_BinaryMatrix)) # 用汇总数据生成简化版upset(可直接用ggplot2模拟upset结构,或适配ComplexUpset格式)
2. 用优化工具保存矢量图
如果不想修改绘图代码,换用更高效的矢量保存工具,自动剔除冗余元素:
- 用
svglite包保存SVG,它比默认设备更精简:
library(svglite) svglite("upset_plot.svg", width=10, height=6) # 插入你的upset绘图代码 dev.off()
- 对已生成的大SVG进行压缩:用
rsvg包优化
library(rsvg) rsvg_svg(input = "large_upset.svg", output = "small_upset.svg", options = "--remove-unused-defs --pretty-print")
3. 转成高分辨率位图嵌入
如果不是必须用矢量图,保存为高分辨率PNG完全能满足学术需求,体积会大幅缩小:
ggsave("upset_plot.png", plot = your_upset_plot, dpi = 300, width = 10, height = 6)
Overleaf加载PNG毫无压力,300dpi的清晰度也足够印刷或展示。
4. 调整ComplexUpset参数,避免加载全量数据
查看ComplexUpset文档,部分参数可直接传入预计算的统计值,比如手动指定set_sizes,不用让函数重新遍历全量数据:
upset( M1_BinaryMatrix, colnames(M1_BinaryMatrix), sort_intersections_by='ratio', intersections='all', min_degree=2, # 手动传入预计算的集合大小绘图 set_sizes=( ggplot(set_sizes, aes(x = set, y = count)) + geom_col() + geom_text(aes(label=paste0(round(ratio*100), '%')), hjust=1.1, color='white') + expand_limits(y=1000) + ylab("") + theme(axis.text.x = element_blank()) ), # 其余参数保持不变 ... )
这样函数不会再处理全量原始数据,生成的矢量文件自然更小。
内容的提问来源于stack exchange,提问作者Sean_TBI_Research
相关产品推荐
相关产品推荐

