我正在尝试拟合一个区域图,以显示随着时间的推移不同事件的访客数量。我的问题是,如果其中一个事件在另一个事件开始时完全相同的时间点结束,则图表会变得混乱。
下面的代码生成了一个图,其中区域显示了真实的访问者数量,但它留下了空白。
df1 <- data.frame(time = c(1,2,3,3,4,5),
visitors = rep(3,6),
type = c(rep("A",3),
rep("B",3)))
ggplot(data = df1, aes(x = time, y = visitors, fill = type)) +
geom_area(stat = "identity")
用空白多边形绘制:
但是,这会留下空白区域。我从R 中知道:stacked geom_area plot 显示空白多边形,可以通过添加明确指定零的数据来填充该区域:
df2 <- data.frame(time = rep(1:5, 2),
visitors = c(3,3,3,0,0,
0,0,3,3,3),
type = c(rep("A",5),
rep("B",5)))
ggplot(data = df2, aes(x = time, y = visitors, fill = type)) +
geom_area(position = "stack")
用空白多边形绘制:
不幸的是,这会通过在 3 点之前显示事件 B 的访问者和在 3 点之后显示事件 A 的访问者来伪造数据。我从geom_area 知道会在层之间产生空白区域,这在某种程度上可以通过使用来处理position = "dodge"
,但是问题在一定程度上仍然存在,因为在 3 之前仍然显示事件 B 的访问者:
使用 position = "dodge" 后的绘图:
编辑1:最后的情节应该是这样的:
编辑 2:我刚刚意识到我用于上图的代码是我真正想要的。
df3 <- data.frame(start = c(1,6,3),
end = c(6,9,7),
visitors = c(3,4,2),
type = c("A", "B", "C"))
df3 <- df3[rep(rownames(df3), df3$end-df3$start),]
# creates a vectorized seq() function
seq.vector <- Vectorize(seq.default, vectorize.args = c("from", "to"))
# creates a data point between every two time points of each event
df3$time <- unlist(seq.vector(unique(df3)$start + 0.5, unique(df3)$end - 0.5, 1))
ggplot(data = df3, aes(x = time, y = visitors, fill = type)) +
geom_bar(stat = "identity", width = 1)
所以感谢 teunbrand 提出了正确的问题。