【问题标题】:ggplot2: Using `fill = …` in aes(..) and geom_bar(..). The colors repeatggplot2:在 aes(..) 和 geom_bar(..) 中使用 `fill = ...`。颜色重复
【发布时间】:2014-01-04 11:22:03
【问题描述】:

这是带有ggplot的条形图:

library(ggplot2)
ggplot(subset(dat, Gene=='3_RH2B'), aes(x=Morpho, y=Weights, fill=Model2)) + geom_bar(stat='identity') + ggtitle('RH2B')

我的问题是颜色重复而不是形成一个大块。我希望每个条由三个颜色块组成,对应于变量dat$Model2 的三个级别。我怎样才能做到这一点?为什么 ggplot 会创建这个图表而不是直接创建我想要的那个?

这里是data.frame dat:

      Gene    Morpho Model     Weights Model2
1   1_RH1 Morph_PC1  OUMV 0.081666667   OUMx
2   1_RH1 Morph_PC1   OUM 0.093333333   OUMx
3   1_RH1 Morph_PC1   BM1 0.286666667    BMx
4   1_RH1 Morph_PC1 OUMVA 0.191666667   OUMx
5   1_RH1 Morph_PC1   OU1 0.076666667    OU1
6   1_RH1 Morph_PC1   BMS 0.255000000    BMx
7   1_RH1 Morph_PC1  OUMA 0.013333333   OUMx
8   1_RH1 Morph_PC2   OU1 0.106666667    OU1
9   1_RH1 Morph_PC2   BM1 0.030000000    BMx
10  1_RH1 Morph_PC2   OUM 0.226666667   OUMx
11  1_RH1 Morph_PC2 OUMVA 0.346666667   OUMx
12  1_RH1 Morph_PC2  OUMA 0.238333333   OUMx
13  1_RH1 Morph_PC2  OUMV 0.045000000   OUMx
14  1_RH1 Morph_PC2   BMS 0.003333333    BMx
15  2_LWS Morph_PC1   BM1 0.545000000    BMx
16  2_LWS Morph_PC1   BMS 0.253333333    BMx
17  2_LWS Morph_PC1   OUM 0.061666667   OUMx
18  2_LWS Morph_PC1  OUMV 0.018333333   OUMx
19  2_LWS Morph_PC1  OUMA 0.015000000   OUMx
20  2_LWS Morph_PC1 OUMVA 0.110000000   OUMx
21  2_LWS Morph_PC1   OU1 0.000000000    OU1
22  2_LWS Morph_PC2   OU1 0.136666667    OU1
23  2_LWS Morph_PC2   OUM 0.078333333   OUMx
24  2_LWS Morph_PC2 OUMVA 0.373333333   OUMx
25  2_LWS Morph_PC2   BM1 0.028333333    BMx
26  2_LWS Morph_PC2  OUMV 0.018333333   OUMx
27  2_LWS Morph_PC2  OUMA 0.353333333   OUMx
28  2_LWS Morph_PC2   BMS 0.013333333    BMx
29 3_RH2B Morph_PC1   BM1 0.301666667    BMx
30 3_RH2B Morph_PC1   BMS 0.478333333    BMx
31 3_RH2B Morph_PC1   OU1 0.091666667    OU1
32 3_RH2B Morph_PC1   OUM 0.066666667   OUMx
33 3_RH2B Morph_PC1  OUMA 0.028333333   OUMx
34 3_RH2B Morph_PC1  OUMV 0.023333333   OUMx
35 3_RH2B Morph_PC1 OUMVA 0.008333333   OUMx
36 3_RH2B Morph_PC2   OUM 0.246666667   OUMx
37 3_RH2B Morph_PC2  OUMA 0.171666667   OUMx
38 3_RH2B Morph_PC2  OUMV 0.096666667   OUMx
39 3_RH2B Morph_PC2   BMS 0.106666667    BMx
40 3_RH2B Morph_PC2   OU1 0.213333333    OU1
41 3_RH2B Morph_PC2   BM1 0.140000000    BMx
42 3_RH2B Morph_PC2 OUMVA 0.025000000   OUMx

【问题讨论】:

    标签: r plot ggplot2 bar-chart


    【解决方案1】:

    您的 data.frame 似乎是一个汇总表。在这种情况下,stat = 'identity' 可能适用于 geom_bar 命令。除了没有。您需要 ggplot 在汇总表上执行其他聚合。对于第一个堆叠条(MORPH_PC1),要堆叠的组件是有序的,尽管stat='identity',ggplot 将添加适当的权重。但是,如果您更改第一个堆叠条的组件顺序,那么它也将包含重复的颜色。例如,使用带有以下数据框的 ggplot 命令来查看效果。这是您的数据框,除了 Model2 变量的顺序略有变化。

    dat = read.table(text = "      Gene    Morpho Model     Weights Model2
    29 3_RH2B Morph_PC1   BM1 0.301666667    BMx
    32 3_RH2B Morph_PC1   OUM 0.066666667   OUMx
    30 3_RH2B Morph_PC1   BMS 0.478333333    BMx
    31 3_RH2B Morph_PC1   OU1 0.091666667    OU1
    33 3_RH2B Morph_PC1  OUMA 0.028333333   OUMx
    34 3_RH2B Morph_PC1  OUMV 0.023333333   OUMx
    35 3_RH2B Morph_PC1 OUMVA 0.008333333   OUMx
    36 3_RH2B Morph_PC2   OUM 0.246666667   OUMx
    37 3_RH2B Morph_PC2  OUMA 0.171666667   OUMx
    38 3_RH2B Morph_PC2  OUMV 0.096666667   OUMx
    39 3_RH2B Morph_PC2   BMS 0.106666667    BMx
    40 3_RH2B Morph_PC2   OU1 0.213333333    OU1
    41 3_RH2B Morph_PC2   BM1 0.140000000    BMx
    42 3_RH2B Morph_PC2 OUMVA 0.025000000   OUMx", header = TRUE, sep = "")
    

    @Alpha 提供的解决方案的其他解决方案:

    在ggplot2命令之外执行额外的聚合,然后绘图:

    datRevised = aggregate(Weights ~ Morpho + Model2, data = dat, FUN = "sum")
    ggplot(datRevised, aes(x=Morpho, y=Weights, fill=Model2)) + geom_bar(stat='identity') + ggtitle('RH2B')
    

    或者,在原始数据框上使用weight 美学(有关一些详细信息,请参阅here - 大约在页面的一半处)。

    ggplot(dat, aes(x=Morpho, weight=Weights, fill=Model2)) + geom_bar() + ggtitle('RH2B')
    

    【讨论】:

      【解决方案2】:

      您需要按名称对Model2 列进行排序,然后它就可以正常工作了:

      sub <- subset(dat, Gene == '3_RH2B')
      df <- sub[with(sub, order(Model2)), ]
      
      
      ggplot(df, aes(x = Morpho, y = Weights, fill = Model2)) + 
        geom_bar(stat = 'identity') + ggtitle('RH2B')
      

      如果您尝试在没有stat = 'identity' 的情况下绘制未排序的数据(并且因为它删除了Weights 的权重),您可以看到块问题不会发生:

      ggplot(sub, aes(x = Morpho, fill = Model2)) + geom_bar() + ggtitle('RH2B')
      

      【讨论】:

      • 确实这是一个解决方案。能告诉我更多关于我的问题发生的原因吗?为什么ggplot 只使用填充来决定颜色而不是分组数据的方式?
      • @Remi.b 我不确定,但我猜是因为 stat = 'identity'
      • @Remi.b 是我编辑的答案仍然不是您需要的吗?
      • 嗯,在我看来,订购是一种糟糕的解决方案。仍然是一个!我很惊讶没有其他解决方案可以减轻重量或重新排序组。无论如何,当我最终使用你为我的工作重新订购的解决方案时,我会检查你的答案。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多