使用Fantaxtic绘制phyloseq图:如何调整时序与数值数据顺序?
解决Fantaxtic绘图的两个排序问题
问题1:月份分组按时间顺序展示
你代码里的核心问题是变量名不匹配:你给sample_data(ps)$Month设置了正确的时间因子水平,但绘图时facet_wrap调用的是~Month_2,相当于完全没用到你设置好顺序的变量,所以图表还是按字母排序。
修正方案:
- 确认你实际用来分组的变量是
Month还是Month_2,统一变量名。 - 如果用
Month_2,就给它设置对应时间顺序的因子水平;如果用Month,就把facet_wrap里的Month_2替换成Month。
修正后的代码示例:
# 假设你要使用的分组变量是Month_2,给它设置因子水平 sample_data(ps)$Month_2 = factor(sample_data(ps)$Month_2, levels = c("Nov 2020","Apr 2021","May 2021","Jul 2021", "Feb 2022", "Mar 2022", "Apr 2022")) ps_norm <- transform_sample_counts(ps, function(x) x / sum(x) ) top_order <- top_taxa(ps_norm, n_taxa = 15, tax_level = "Order") plot_nested_bar(top_order$ps_obj, top_level = "Phylum", nested_level = "Order") + facet_wrap(~Month_2, scales = "free_x")
问题2:样本名按数值顺序展示
R默认按字符编码排序,所以"900"会被识别为比"1000"大(因为首字符"9"的ASCII码大于"1")。解决思路是将样本名转换为按数值逻辑排序的因子,有两种简单方法:
方法1:用gtools包自动混合排序(推荐)
mixedsort函数可以自动识别字符串中的数字,按数值大小排序:
# 先安装并加载gtools包 install.packages("gtools") library(gtools) # 重新设置样本名的因子水平,按混合排序规则排列 sample_names(ps) <- factor(sample_names(ps), levels = mixedsort(sample_names(ps))) # 后续绘图时样本就会按数值顺序展示
方法2:手动提取数字排序(适用于样本名仅含数字的情况)
如果样本名全是数字字符串,可以直接提取数值后排序:
# 将样本名转为数值,排序后重新设置因子水平 sample_numbers <- as.numeric(sample_names(ps)) sorted_sample_names <- sample_names(ps)[order(sample_numbers)] sample_names(ps) <- factor(sample_names(ps), levels = sorted_sample_names)
内容的提问来源于stack exchange,提问作者MAlvarez
相关产品推荐
相关产品推荐

