使用ggplot绘制100%堆积面积图

3

我有两个数据框: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个回答

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)

在此输入图片描述

数据:

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中的行数相匹配。


尽管我按照你的建议使用了,但是图形并没有出现在各个方面内。只有空白的方面被显示出来。我不知道原因是什么。 - Vasker Sharma
@Vasker Sharma,你能否复制我发布的完整代码,从创建lfhf开始,加载library(tidyverse),然后运行代码lf %>%....?你能够绘制任何ggplot2的例子吗? - missuse
谢谢@missuse,你的方法帮了我大忙。我只是把年份列转换成数字,就解决了问题。 - Vasker Sharma

4
我的回答与@missuse的回答差别不大,只是跳过了计算比例的必要性。
对于ggplot,通常希望数据呈现长格式,在绑定两个数据框并标记哪些数据框观测来自(在mutate中创建类型列)后,您应该收集数据。在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包(v0.2.0)于2018年5月20日创建的。


谢谢。这些代码只能显示空白的面和图形无法显示。与@missuse建议的代码发生了同样的事情。 - Vasker Sharma
为了能够调试这个问题,如果你使用dput将你的数据发布出来会更有帮助。 - camille
dput(head(df)) 结构(列表)(年份,类型,测量,值),行名为NA,类别为数据框。 - Vasker Sharma
尝试将年份转换为数字。 - camille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接