【问题标题】:Stacked bar plot using R and ggplot使用 R 和 ggplot 的堆积条形图
【发布时间】:2019-03-05 11:58:30
【问题描述】:

我在这里尝试了堆叠条形图的建议,但似乎无法使其工作。

我试图绘制的数据:

Technology   TodayScenario  WindScenario  BiomassScenario  
Biomass        0.130          0.0646         0.182 
Fossil gas     0.0965         0.00309        0     
Coal           0.218          0              0     
Oil            0.00696        0              0     
PV             0.0328         0.0245         0.0266
Waste          0.0420         0              0     
Onshore        0.323          0.311          0.337 
Offshore       0.150          0.597          0.454

所以我试图用场景中每种技术的百分比来绘制每个场景

我已经尝试了以下方法来获取堆叠图,但没有奏效。

ggplot(Distribution, 
       aes(x = WindScenario, y = Technology) + 
   geom_bar(stat = "identity")

【问题讨论】:

    标签: r ggplot2 bar-chart


    【解决方案1】:

    为了使您的数据有一个堆积条形图,您需要将数据组织成三列 - 技术、价值和场景 - 就像这样(您可以将其复制并粘贴到您的控制台中):

    structure(list(Technology = structure(c(1L, 1L, 1L, 3L, 3L, 3L, 
    2L, 2L, 2L, 5L, 5L, 5L, 7L, 7L, 7L, 8L, 8L, 8L, 6L, 6L, 6L, 4L, 
    4L, 4L), .Label = c("Biomass", "Coal", "Fossil gas", "Offshore", 
    "Oil", "Onshore", "PV", "Waste"), class = "factor"), Values = c(0.13, 
    0.0646, 0.182, 0.0965, 0.00309, 0, 0.218, 0, 0, 0.00696, 0, 0, 
    0.0328, 0.0245, 0.0266, 0.042, 0, 0, 0.323, 0.311, 0.337, 0.15, 
    0.597, 0.454), Scenarios = structure(c(2L, 3L, 1L, 2L, 3L, 1L, 
    2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L, 1L), .Label = c("Biomass Scenario", "Today Scenario", "Wind Scenario"
    ), class = "factor")), class = "data.frame", row.names = c(NA, 
    -24L))
    

    按因素对场景数据进行排序:

    df$Scenarios <- factor(df$Scenarios,levels = c("Today Scenario",
                                               "Wind Scenario",
                                               "Biomass Scenario"))
    

    排列正确后,现在可以在ggplot2中输出如下堆积条形图:

    library(ggplot2)
    ggplot(df, aes(fill=Technology, y=Values, x=Scenarios)) + 
       geom_bar( stat="identity")
    

    【讨论】:

    • 好的,非常感谢,这就是我想要做的
    【解决方案2】:
    ggplot(my_df, 
           aes(x = Technology, y = WindScenario)) + 
      geom_bar(stat = "identity", position = "stack")
    

    【讨论】:

      【解决方案3】:

      切换xy,合上ggplot()的括号:

      ggplot(Distribution, 
             aes(x = Technology, y = WindScenario)) + 
        geom_bar(stat = "identity")
      

      如果你想要垂直轴上的条,你可以在图中添加coord_flip()

      【讨论】:

        【解决方案4】:

        要实现这一点,您需要先重组数据,使其具有三列:TechnologyScenarioPercentage。比如:

        Technology   Scenario         Percentage     
        Biomass      TodayScenario    0.130 
        Fossil gas   TodayScenario    0.0965     
        Biomass      WindScenario     0.0646
        Fossil gas   WindScenario     0.00309
        Biomass      BiomassScenario  0.182
        Fossil gas   BiomassScenario  0
        

        您可以为此使用tidyr::gather()

        library(tidyr)
        
        my_df %>%
          gather(Scenario, Percentage, c(TodayScenario, WindScenario, BiomassScenario)) %>%
          ggplot(aes(Scenario, Percentage, fill = Technology)) +
          geom_bar(stat = 'identity')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-08
          • 1970-01-01
          相关资源
          最近更新 更多