You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:27:26