我试图展示不同年龄阶层的比例是如何随着时间而变化的。目前,对于所有数据,我有给定年龄的个体比例(pAge),以及我在geom_ribbon中使用的每个年龄的最小/最大值(cpAgeMin和cpAgeMax)的比例累积和。
不幸的是,即使所有的比例总和为1,我的图似乎并没有正确地反映数据,因为在几年内有一些没有数据的空白点。这些似乎不是数据的问题,而是ggplot正在做的事情。我如何解决这个问题,以便将每年0-1的整个区域分配给一个年龄组。
# subset of data
df <- structure(list(site = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
levels = "G", class = "factor"),
year = c(1988, 1988, 1989, 1989, 1989, 1990, 1990, 1991, 1991, 1991,
1992, 1992, 1992, 1993, 1993, 1993, 1998, 1998, 1998, 1999,
1999, 1999, 2000, 2000, 2000, 2001, 2001, 2001, 2002, 2002,
2003, 2003, 2003),
age = c(`9104` = 1, `9341` = 2, `9292` = 1, `9632` = 2, `9960` = 4,
`9543` = 1, `9857` = 3, `9685` = 1, `9968` = 2, `10169` = 3,
`9858` = 1, `10127` = 2, `10212` = 3, `10009` = 1, `10284` = 2,
`10522` = 6, `10464` = 1, `10605` = 2, `10830` = 3, `10556` = 1,
`10744` = 2, `11056` = 3, `10687` = 1, `11061` = 2, `11279` = 5,
`10912` = 1, `11109` = 2, `11197` = 3, `11065` = 1, `11194` = 2,
`11154` = 1, `11255` = 2, `11324` = 3),
pAGE = c(0.972, 0.028, 0.964, 0.005, 0.031, 0.823, 0.177, 0.921, 0.074,
0.004, 0.846, 0.045, 0.109, 0.833, 0.155, 0.012, 0.927, 0.054,
0.019, 0.784, 0.21, 0.005, 0.958, 0.017, 0.025, 0.852, 0.124,
0.024, 0.913, 0.087, 0.909, 0.073, 0.019),
cpAgeMin = c(0, 0.972, 0, 0.964, 0.969, 0, 0.823, 0, 0.921, 0.996, 0,
0.846, 0.891, 0, 0.833, 0.988, 0, 0.927, 0.981, 0, 0.784,
0.995, 0, 0.958, 0.975, 0, 0.852, 0.976, 0, 0.913, 0, 0.909,
0.981),
cpAgeMax = c(0.972, 1, 0.964, 0.969, 1, 0.823, 1, 0.921, 0.996, 1, 0.846,
0.891, 1, 0.833, 0.988, 1, 0.927, 0.981, 1, 0.784, 0.995, 1,
0.958, 0.975, 1, 0.852, 0.976, 1, 0.913, 1, 0.909, 0.981, 1),
seg = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)),
row.names = c(NA, -33L), class = c("tbl_df", "tbl", "data.frame"))
# plot
ggplot(data = df) +
geom_ribbon(aes(x = year, ymin = cpAgeMin, ymax = cpAgeMax, group = interaction(seg, factor(age)), fill = factor(age), col = factor(age))) +
theme_bw()
更新:
在对第二个站点实施@Andy巴克斯特的解决方案后,图中出现的数据范围之外有额外的“凸起”。我该怎么摆脱这些?
2条答案
按热度按时间yqhsw0fo1#
将其与
geom_area
和position = "fill"
叠加可能是最平滑的:bf1o4zei2#
好吧,我不喜欢这个解决方案,但这里有一些东西可以填补缺失的值。基本上,我们需要使用
complete
将隐式NA转换为显式NA,但随后我们需要以“zig-zag”方式填充内容,而不是直接向下填充一列。可能有更好的方法,但我想到的是:产生