我有一个数据框,其中包含某些因素的每日数据(" fill" var)我想用ggplot2::geom_area
函数绘制一个区域图,但可能会丢失" fill& #34;第0天或最后一天的值。
df <- data.frame(x = do.call(c, mapply(rep, seq(Sys.Date() - 2, Sys.Date(), by = 1), c(2, 3, 2))),
y = 1,
fill = c("A", "B", "A", "B", "C", "A", "C"))
x y fill
1 2015-07-06 1 A
2 2015-07-06 1 B
3 2015-07-07 1 A
4 2015-07-07 1 B
5 2015-07-07 1 C
6 2015-07-08 1 A
7 2015-07-08 1 C
如果您尝试绘制区域:
library(plyr)
library(dplyr)
library(ggplot2)
df %>%
group_by(x) %>%
mutate(freq = y / sum(y)) %>%
ggplot(aes(x, freq, fill = fill)) +
geom_area()
你得到了这个:
填充因子X的回归将从值X的第一次出现的那天开始,并结束该因子的最后一次出现的那天。 因此,如果不是所有现有值都出现在第0天和最后一天,则该图将获得白色间隙。
我认为我可以通过在那些日子里添加缺失因子(y = 0)来强制回归从第0天开始到最后一天结束,但它似乎仅适用于缺少第1天的数据:
df <- arrange(df, x)
li <- split(df, df$x)
li[[1]] <-
ldply(li, function(x)
anti_join(x, li[[1]], by = "fill"), .id = NULL) %>%
mutate(x = as.Date(names(li[1])),
y = 0) %>%
distinct %>%
bind_rows(li[[1]], .)
li[[length(li)]] <-
ldply(li, function(x)
anti_join(x, last(li), by = "fill"), .id = NULL) %>%
mutate(x = as.Date(last(names(li))),
y = 0) %>%
distinct %>%
bind_rows(last(li), .)
df.m <- bind_rows(li)
df.m %>%
group_by(x) %>%
mutate(freq = y / sum(y)) %>%
ggplot(aes(x, freq, fill = fill)) +
geom_area()
您是否有任何想法填补空白或任何建议?感谢
(也许你会认为,如果有很多缺失值,那么区域图可能是一个糟糕的数据可视化,但我的实际数据中没有很多缺失的值,而且它们都在更长的一段时间,所以我在开始或结束时只有一点差距,但它可见但我想隐藏它)
请告诉我,如果不清楚我在问什么,我会尽力而为。