【问题标题】:order data to plot barplot in ggplot2订购数据以在 ggplot2 中绘制条形图
【发布时间】:2026-01-15 01:40:01
【问题描述】:

我需要为我的数据构建一个条形图,显示不同样本中的细菌相对丰度(在完整数据集中,每列的总和应为 1)。

我的数据子集:

> mydata


Taxon   CD6 CD1 CD12
Actinomycetaceae;g__Actinomyces 0.031960309 0.066683743 0.045638509
Coriobacteriaceae;g__Atopobium  0.018691589 0.003244536 0.00447774
Corynebacteriaceae;g__Corynebacterium   0.001846083 0.006403689 0.000516662
Micrococcaceae;g__Rothia    0.001730703 0.000426913 0.001894429
Porphyromonadaceae;g__Porphyromonas 0.073497173 0.065915301 0.175406872

我想要的是每个样本(CD6、CD1、CD12)的条形图,其中 y 值是细菌种类的相对丰度(Taxon 列)。

我认为(但我不确定)我的数据格式不适合绘制,因为我没有像我发现的示例中那样分组的变量...

ggplot(data) + geom_bar(aes(x=revision, y= added), stat="identity", fill="white", colour="black")

有没有办法对我的数据进行排序,使其正确地作为该代码的输入? 或者我该如何修改它? 谢谢!

【问题讨论】:

    标签: r ggplot2 bar-chart


    【解决方案1】:

    你想要这样的东西吗?

    # sample data
    df <- read.table(header=T, sep=" ", text="
    Taxon CD6 CD1 CD12
    Actinomycetaceae;g__Actinomyces 0.031960309 0.066683743 0.045638509
    Coriobacteriaceae;g__Atopobium 0.018691589 0.003244536 0.00447774
    Corynebacteriaceae;g__Corynebacterium 0.001846083 0.006403689 0.000516662
    Micrococcaceae;g__Rothia 0.001730703 0.000426913 0.001894429
    Porphyromonadaceae;g__Porphyromonas 0.073497173 0.065915301 0.175406872")
    
    # convert wide data format to long format
    require(reshape2)
    df.long <- melt(df, id.vars="Taxon",
                    measure.vars=grep("CD\\d+", names(df), val=T),
                    variable.name="sample",
                    value.name="value")
    
    # calculate proportions
    require(plyr)
    df.long <- ddply(df.long, .(sample), transform, value=value/sum(value))
    
    # order samples by id     
    df.long$sample <- reorder(df.long$sample, as.numeric(sub("CD", "", df.long$sample)))
    
    # plot using ggplot
    require(ggplot2)
    ggplot(df.long, aes(x=sample, y=value, fill=Taxon)) + 
      geom_bar(stat="identity") +
      scale_fill_manual(values=scales::hue_pal(h = c(0, 360) + 15, # add manual colors
                                               c = 100, 
                                               l = 65, 
                                               h.start = 0, 
                                               direction = 1)(length(levels(df$Taxon))))
    

    【讨论】:

    • 是的!这就是我需要的!!谢谢!有没有办法决定为每个 y 值使用哪种颜色并对样本进行排序?
    • 您可以指定自己的颜色,例如通过添加诸如+scale_fill_manual(values=rainbow(n=length(levels(df$Taxon))))之类的东西。要订购样品,请在致电ggplot之前添加df.long$sample &lt;- reorder(df.long$sample, as.numeric(sub("CD", "", df.long$sample)))之类的东西。
    • 当我尝试时:df.long$sample &lt;- reorder(df.long$sample, as.numeric(sub("CD12", "CD6", "CD1", df.long$sample))) 我收到此错误Errore in tapply(X = X, INDEX = x, FUN = FUN, ...) : arguments must have same length Inoltre: Warning message: In tapply(X = X, INDEX = x, FUN = FUN, ...) : si è prodotto un NA per coercizione 有什么建议吗?
    • 您是否按照我的建议添加了df.long$sample &lt;- reorder(df.long$sample, as.numeric(sub("CD", "", df.long$sample)))
    • 我做了df.long$sample &lt;- reorder(df.long$sample, as.numeric(sub("CD12", "CD6", "CD1", df.long$sample)))我不需要指定我想要的顺序吗??