如何在 y 轴上创建具有多个相同数量值的堆叠条形图

How to create a stacked barplot with multiple values of the same quantity on the y-axis

我试图创建一个我需要的条形图,但我无法弄清楚。详情如下所示。我有一个更大的数据框,但这是我的数据框的一个小例子:

SampleNumber = 1:5
Probability_n1 = c(1, 1, 1, 1, 1)
Probability_n2 = c(1.30066666666667e-14, 3.375e-17, 3.698e-16, 2.03733333333333e-17, 2.16866666666667e-19)
Probability_n3 = c(1.243e-28, 5.59956666666667e-35, 4.75333333333333e-34, 1.0569e-34, 1.21333333333333e-37)
Probability_n4 = c(2.266e-43, 4.36333333333333e-56, 4.47933333333333e-53, 1.39033333333333e-53, 2.33566666666667e-56)
Probability_n5 = c(1.7407e-57, 2.59733333333333e-76, 7.461e-73, 2.46833333333333e-72, 2.133e-76)
df = cbind(SampleNumber, Probability_n1, Probability_n2, Probability_n3, Probability_n4, Probability_n5)

df

           SampleNumber   Probability_n1   Probability_n2   Probability_n3   Probability_n4    Probability_n5
[1,]           1                1           1.300667e-14     1.243000e-28      2.266000e-43    1.740700e-57
[2,]           2                1           3.375000e-17     5.599567e-35      4.363333e-56    2.597333e-76
[3,]           3                1           3.698000e-16     4.753333e-34      4.479333e-53    7.461000e-73
[4,]           4                1           2.037333e-17     1.056900e-34      1.390333e-53    2.468333e-72
[5,]           5                1           2.168667e-19     1.213333e-37      2.335667e-56    2.133000e-76

我正在尝试创建一个堆叠条形图(数据框中每个 sample/row 一个条形图),其中样本编号在 x 轴上,而 y 轴的概率使得每个概率(n=1、2、3、4、5)在每个样本的同一条中用不同的颜色填充。

P.S:我知道在我的示例中,n=2、3、4、5 值非常小,无法显示在条形图上,但我的实际数据框有很多样本,其中不同n 值的概率远高于该样本的其他 n 值。

您可以使用 ggplot 进行可视化:

library(ggplot2)

首先,从您的 matrix 创建一个 data.frame,然后使用数据 table 包中的 melt() 将它从宽改造成长,它给您这个:

head(data.table::melt(df, id.vars = "SampleNumber"))
  SampleNumber       variable        value
1            1 Probability_n1 1.000000e+00
2            2 Probability_n1 1.000000e+00
3            3 Probability_n1 1.000000e+00
4            4 Probability_n1 1.000000e+00
5            5 Probability_n1 1.000000e+00
6            1 Probability_n2 1.300667e-14

然后简单地创建一个条形图并使用 fill 美学为概率添加颜色。

df <- data.frame(df)
data.table::melt(df, id.vars = "SampleNumber") %>% 
  ggplot() +
  geom_bar(aes(y = value,
               x = SampleNumber,
               fill = variable),
           stat = 'identity')

结果如下所示: