使用ggplot 100%堆积区域

时间:2018-05-19 18:56:13

标签: r ggplot2

我有两个数据框:LF和HF

head(LF)
Year     SS    SS_CQT  SRP  SRP_CQT  TDP  TDP_CQT   TP   TP_CQT
1 2009 386.18 1164.3966 4586 12.30089 5285 14.23955 6707 18.17906
2 2010 268.72  884.9963 4354 13.37728 4927 15.20045 6078 18.81523
3 2011 347.61  746.7686 6924 12.25466 7917 13.84788 9302 16.93291
4 2012 170.68 1218.6758 2471 16.39350 3006 19.60066 3670 24.18561

head(HF)
Year     SS    SS_CQT  SRP  SRP_CQT  TDP  TDP_CQT   TP   TP_CQT
1 2009 184.44  4055.367  535 11.53037  621 13.50632 1175 25.82282
2 2010 118.08  2726.272  737 14.44196  868 16.92781 1236 24.56522
3 2011 119.90  2208.308  663 10.19803  742 11.42253 1086 17.36818
4 2012 554.07 11913.003 2413 45.44719 2781 52.90863 4290 85.87746
5 2013 165.32  5926.628  424 15.93962  461 17.16547  873 31.70556

以下关系遵循以上数据框:LF $ SS + HF $ SS =总负载

我想用两个数据框绘制每个列变量的LF和HF的比例(%),如下所示; enter image description here

您的帮助将不胜感激

2 个答案:

答案 0 :(得分:4)

这是一种方法:

library(tidyverse)

lf %>%
  mutate(col = "lf") %>% #add column to lf specifying the data frame
  bind_rows(hf %>% #bind rows of hf
              mutate(col = "hf")) %>% #add column to hf specifying the data frame
  gather(key, value, 2:9) %>% #convert to long format
  group_by(key, Year) %>% #group by variable and year
  mutate(ratio = value/sum(value)) %>% #calculate the desired ratio
  ggplot()+
  geom_area(aes(x = Year, y = ratio, fill = col)) + #pretty much self explanatory
    facet_wrap(~key) +
  scale_y_continuous(labels = scales::percent)

enter image description here

数据:

lf <- read.table(text = "Year     SS    SS_CQT  SRP  SRP_CQT  TDP  TDP_CQT   TP   TP_CQT
1 2009 386.18 1164.3966 4586 12.30089 5285 14.23955 6707 18.17906
2 2010 268.72  884.9963 4354 13.37728 4927 15.20045 6078 18.81523
3 2011 347.61  746.7686 6924 12.25466 7917 13.84788 9302 16.93291
4 2012 170.68 1218.6758 2471 16.39350 3006 19.60066 3670 24.18561", header = T)

hf <- read.table(text = "Year     SS    SS_CQT  SRP  SRP_CQT  TDP  TDP_CQT   TP   TP_CQT
1 2009 184.44  4055.367  535 11.53037  621 13.50632 1175 25.82282
2 2010 118.08  2726.272  737 14.44196  868 16.92781 1236 24.56522
3 2011 119.90  2208.308  663 10.19803  742 11.42253 1086 17.36818
4 2012 554.07 11913.003 2413 45.44719 2781 52.90863 4290 85.87746", header = T)

我已移除hf的最后一行,因此它与lf

中的行数相匹配

答案 1 :(得分:3)

我的答案与@ missuse的差别不大,只是它不需要计算比例。

对于ggplot,您通常需要长形状的数据,因此在绑定两个数据框并标记哪些数据框观察结果后(在type中创建mutate列),你应该gather数据。在geom_area中,使用position = position_fill()计算每个方面的比例,而不是您需要手动执行此操作。

library(tidyverse)

lf <- read.table(text = "Year     SS    SS_CQT  SRP  SRP_CQT  TDP  TDP_CQT   TP   TP_CQT
1 2009 386.18 1164.3966 4586 12.30089 5285 14.23955 6707 18.17906
2 2010 268.72  884.9963 4354 13.37728 4927 15.20045 6078 18.81523
3 2011 347.61  746.7686 6924 12.25466 7917 13.84788 9302 16.93291
4 2012 170.68 1218.6758 2471 16.39350 3006 19.60066 3670 24.18561", header = T)

hf <- read.table(text = "Year     SS    SS_CQT  SRP  SRP_CQT  TDP  TDP_CQT   TP   TP_CQT
1 2009 184.44  4055.367  535 11.53037  621 13.50632 1175 25.82282
2 2010 118.08  2726.272  737 14.44196  868 16.92781 1236 24.56522
3 2011 119.90  2208.308  663 10.19803  742 11.42253 1086 17.36818
4 2012 554.07 11913.003 2413 45.44719 2781 52.90863 4290 85.87746", header = T)

df <- bind_rows(
  lf %>% mutate(type = "LF"),
  hf %>% mutate(type = "HF")
) %>%
  gather(key = measure, value = value, -Year, -type)

ggplot(df, aes(x = Year, y = value, fill = type)) +
  geom_area(position = position_fill()) +
  facet_wrap(~ measure) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c(HF = "darkorange", LF = "slateblue"))

reprex package(v0.2.0)创建于2018-05-20。