我的 ggplot2 或 R 代码是否有问题来绘制有序的祖先堆叠条形图?

Is something wrong with my ggplot2 or R code to plot an ordered ancestry stacked barplot?

我想创建一个有组织的堆叠条形图,其中比例相似的条形图一起出现。我有一个包含 10,000 个人的数据框,每个人都来自三个群体。这是我的数据。

library(MCMCpack)
library(ggplot2)
n = 10000
alpha = c(0.1, 0.1, 0.1)

q <- as.data.frame(rdirichlet(n,alpha))
head(q)

individuals <- c(1:nrow(q))
q <- cbind(q, individuals)

head(q)
            V1           V2          V3 individuals
1 0.0032720232 3.381345e-08 0.996727943           1
2 0.3354060035 4.433923e-01 0.221201688           2
3 0.0004121665 9.661220e-01 0.033465842           3
4 0.9966997182 3.234048e-03 0.000066234           4
5 0.7789280208 2.090134e-01 0.012058562           5
6 0.0005048727 9.408364e-02 0.905411485           6

# long format for ggplot2 plotting
qm <- gather(q, key, value, -individuals)
colnames(qm) <- c("individuals", "ancestry", "proportions")
head(qm)

individuals ancestry  proportions
1           1       V1 0.0032720232
2           2       V1 0.3354060035
3           3       V1 0.0004121665
4           4       V1 0.9966997182
5           5       V1 0.7789280208
6           6       V1 0.0005048727

在没有对数据进行任何排序的情况下,我将堆叠条形图绘制为:

ggplot(qm) + geom_bar(aes(x = individuals, y = proportions, fill= ancestry), stat="identity") 

我有两个问题: (1) 我不知道如何让这些比例相似的个体聚集在一起,我已经尝试了很多堆栈交换的解决方案,但无法让它们在我的数据集上工作!

(2) 出于某种原因,似乎当我实现代码以按 decreasing/increasing 比例对个人进行排序时 ancestry,该代码有时适用于我创建的较低维度的玩具数据集,但是当我尝试绘制 10,000 个人时,代码不再起作用了!这是 ggplot2 中的问题还是我做错了什么?我将不胜感激对该线程的任何回答,以绘制 n = 10,000 个堆叠条形图。

(3) 不确定这是不是我的想象,但在我的堆叠条形图中,R 似乎以某种我不知道的顺序对堆叠条形图进行聚类——因为我可以看到堆叠条形图之间的规则间隙地块。实际上,应该没有差距,我不确定为什么会这样。

如果我能提供任何帮助,我将不胜感激,因为我已经在这段代码上工作了很长一段时间,令人尴尬!!

因为,祖先内部的比例差异非常大,条形图看起来像与其他祖先聚集在一起。它以正确的方式绘制。但是,由于人数太多,我们无法区分差异。

如果您认为数据集上的比例不会失去其意义,并且如果将它们转换为指数值或对数值也可以以相同的方式解释,您可以尝试一下。

比例为指数的堆积条:

ggplot(qm) + geom_bar(aes(x = individuals, y = exp(proportions), fill= ancestry), 
                      stat="identity")

如果您不希望条形之间有间隙,请将宽度设置为 1。

ggplot(qm) + geom_bar(aes(x = individuals, y = exp(proportions), fill= ancestry), 
                      stat="identity", 
                      width=1)