【问题标题】:Grouping by two factor variables in ggplot2在ggplot2中按两个因子变量分组
【发布时间】:2017-08-04 09:09:13
【问题描述】:

我正在尝试为五个不同的组绘制两种不同类型的生产。我可以生成绘图并且它看起来已经不错了,尽管最终 ggplot 中的排序不是我想要的那样。 我找到了arrange() 的解决方案,但是尽管这一步中的排序是正确的,但最终的结果又是不同的。 我希望对每个组(1、2、3、4、NA)进行分组,这两种不同类型的生产是相互重叠的。

library(zoo)
library(data.table)
library(ggplot2)
library(dplyr)
DT <- structure(list(Year.Quarter = structure(c(2015, 2015, 2015, 2015, 
                                          2015, 2015.25, 2015.25, 2015.25, 2015.25, 2015.25, 2015.5, 2015.5, 
                                          2015.5, 2015.5, 2015.5, 2015.75, 2015.75, 2015.75, 2015.75, 2015.75, 
                                          2016, 2016, 2016, 2016, 2016, 2016.25, 2016.25, 2016.25, 2016.25, 
                                          2016.25), class = "yearqtr")
                                        , Group = c(2L, 1L, 4L, 3L, NA, 2L, 
                                                  1L, 4L, 3L, NA, 2L, 1L, 4L, 3L, NA, 2L, 1L, 4L, 3L, NA, 2L, 1L, 
                                                  4L, 3L, NA, 2L, 1L, 4L, 3L, NA)
                                        , Conventional.Prod = c(11.78, 7.31, 7.34, 9.44, 28.72, 11.32, 5.27, 7.47, 8.08, 27.14, 11.49, 
                                                                4.65, 7.63, 7.07, 25.93, 10.69, 3.68, 6.96, 6.72, 18.31, 9.28, 
                                                                 3.69, 6.86, 6.34, 19.14, 9.25, 3.69, 6.9, 6.16, 17.7)
                                       , Unconventional.Prod = c(15.22, 10.69, 7.66, 15.56, 30.28, 15.68, 10.73, 7.53, 15.92, 29.86, 
                                                        13.51, 10.35, 7.37, 15.93, 28.07, 13.31, 10.32, 7.04, 16.28, 
                                25.69, 12.72, 9.31, 7.14, 16.66, 25.86, 12.75, 9.31, 7.1, 16.84, 24.3))
                        , .Names = c("Year.Quarter", "Group", "Conventional.Prod", "Unconventional.Prod"), row.names = c(NA, -30L), class = c("data.table", 
                                                      "data.frame"))
data.table::melt(DT,
                 , id.vars = c("Year.Quarter", "Group")
                 , measure.vars = c("Conventional.Prod", "Unconventional.Prod")
) %>% arrange(Year.Quarter, Group, variable) %>%  ggplot(data = ., aes(x = Year.Quarter, y = value, color = variable, fill = as.factor(Group))) +
        geom_area(stat = "identity", position = "fill") +
        #geom_line(aes(x = Calendar.Data.Year.and.Quarter ,y = value)) +
        theme(legend.title=element_blank()) + 
        scale_x_yearqtr(format = "%Y-Q%q",n = 8, expand = c(0,0))

arrange 步骤之后的排序符合预期:

Year.Quarter     Group      variable       value
1:      2015 Q1     1   Conventional.Prod  7.31
2:      2015 Q1     1 Unconventional.Prod 10.69
3:      2015 Q1     2   Conventional.Prod 11.78
4:      2015 Q1     2 Unconventional.Prod 15.22
5:      2015 Q1     3   Conventional.Prod  9.44
6:      2015 Q1     3 Unconventional.Prod 15.56
7:      2015 Q1     4   Conventional.Prod  7.34
8:      2015 Q1     4 Unconventional.Prod  7.66
9:      2015 Q1    NA   Conventional.Prod 28.72
10:     2015 Q1    NA Unconventional.Prod 30.28

但最终情节中的顺序又以某种方式颠倒了,因此生产是主要群体。

【问题讨论】:

  • 我不确定问题是否可以通过使用aes_group_order 来解决,但不确定如何正确实施。

标签: r ggplot2 data.table dplyr


【解决方案1】:

你会对这样的事情感兴趣吗?这并不完全符合您的预期,但它为您的数据提供了很好的可视化效果。

data.table::melt(DT,
                 , id.vars = c("Year.Quarter", "Group")
                 , measure.vars = c("Conventional.Prod", "Unconventional.Prod")
) %>% ggplot(data = ., aes(x = Year.Quarter, y = value, fill = as.factor(Group))) +
  scale_x_yearqtr(format = "%Y-Q%q") +
  geom_bar(stat = "identity",position = "dodge") +
  facet_grid(. ~ variable) +
  theme_bw()

希望这会有所帮助!

【讨论】:

  • 非常感谢,这是一个很好的代表。但我更感兴趣的是展示每组两种生产类型之间的不同模式。所以这就是为什么我希望每个组的作品都彼此相邻。
  • geom_area(stat = "identity") 替换我方法中的geom_bar 代码怎么样?在其中添加position = "fill" 选项后还可以查看差异(注意y 轴的变化)。我认为它应该在一定程度上满足您的要求。
  • 我喜欢分面图的想法,我会尝试使用它,尽管我将facet_grid( variable ~.) + 更改为facet_grid( variable ~.) +,以便更容易比较随时间的发展。
  • 很高兴您喜欢这个解决方案!
  • 虽然我不想将其标记为答案,因为它并没有真正解决问题,而只是添加了可能的数据可视化。
【解决方案2】:

在对ggplot() 的调用中在color 之前指定fill 是一种快速完成我认为您想要的方法:

# Not repeating all the code from your example, but change this line:
ggplot(data = dat, aes(x = Year.Quarter, y = value, fill = as.factor(Group), color = variable))

【讨论】:

  • 嗯,是的,这就是我想要的。我尝试了几乎所有可能的填充和颜色组合,但我从未更改过顺序。我只是从来没有想过这可能会有所作为......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2016-05-28
  • 2019-05-14
  • 2013-08-31
相关资源
最近更新 更多