0

我正在尝试拟合一个区域图,以显示随着时间的推移不同事件的访客数量。我的问题是,如果其中一个事件在另一个事件开始时完全相同的时间点结束,则图表会变得混乱。

下面的代码生成了一个图,其中区域显示了真实的访问者数量,但它留下了空白。

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" 后的绘图:

使用 position = 后的绘图

编辑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 提出了正确的问题。

4

0 回答 0