UpSetR绘制Upset图时按集合大小降序排列的问题
UpSetR绘制Upset图时按集合大小降序排列的问题
你好呀!看了你的问题,你是想让Upset图左侧的集合条形按大小从高到低排列,但目前的代码没达到预期对吧?我帮你梳理下问题和解决方案:
先搞懂参数的作用
你之前的代码里有两个关键参数容易混淆:
order.by = "freq":这个是控制主图里的交集条形(就是中间那些表示集合交集的柱子)按出现频率排序,和左侧单个集合的排序没关系哦。keep.order = TRUE:这个会强制左侧集合严格按照你sets参数里写的顺序显示,但如果你的sets顺序和实际数据中集合的真实大小不符,或者你想让程序自动根据数据排序,这个参数反而会限制效果。
解决方案分两种情况
情况1:你明确知道集合的大小顺序,想强制固定这个顺序
如果你已经确定了集合的大小排序(比如你写的AB(10000) > ND(9000) > ... > NM(5000)),那只需要调整两个小地方:
- 确保
sets参数按你要的降序排列 - 打开
decreasing = TRUE(你之前注释掉了),让交集条形也按频率降序显示
修改后的代码:
UpSetR::upset( modality_matrix_upset, nsets = 7, sets = c("AB (10000)","ND (9000)", "US (8000)","CA (7500)", "RF (7000)", "XA (6500)","NM (5000)"), # number.angles = 30, order.by = "freq", decreasing = TRUE, # 打开这个,让交集按频率降序 keep.order = TRUE, # 强制保持你指定的集合顺序 mainbar.y.label = "Number of school", sets.x.label = "Number of participant schools" )
情况2:想让程序自动根据数据中集合的真实大小降序排列
如果你的集合大小是动态的(比如实际数据中集合大小可能变化),可以先计算每个集合的大小,再重新排列数据框的列,让程序自动按大小排序:
# 第一步:计算每个集合的真实大小(因为是0-1矩阵,列的和就是集合的元素数量) set_sizes <- colSums(modality_matrix_upset) # 第二步:按大小降序提取集合名称 sorted_sets <- names(sort(set_sizes, decreasing = TRUE)) # 第三步:重新排列数据框的列顺序 modality_matrix_sorted <- modality_matrix_upset[, sorted_sets] # 第四步:绘制Upset图 UpSetR::upset( modality_matrix_sorted, nsets = 7, order.by = "freq", decreasing = TRUE, keep.order = FALSE, # 不需要强制固定顺序,让程序按数据框列顺序来 mainbar.y.label = "Number of school", sets.x.label = "Number of participant schools" )
这样运行后,左侧的集合条形就会自动按照实际数据中的大小从高到低排列啦~
备注:内容来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

