我想用ggplot2画一条时间线.一些事件同时发生,并且ggplot2倾向于将它们一个接一个地画在一起,使得只有一个事件保持可见.

以下是事件的示例表:

library(tidyverse)
events <- 
  tribble(
    ~group,   ~name,          ~start,       ~end,         ~color,
    "group1", "first event",  "2023-09-19", "2023-11-19", "color1",
    "group1", "in parallel",  "2023-09-19", "2023-11-19", "color2",
    "group1", "later",        "2024-09-01", "2024-09-21", "color1"
  ) |>
  mutate(start=lubridate::ymd(start),
         end=lubridate::ymd(end))

以下是目前为止的ggplot2命令:

ggplot(events,
       aes(xmin=start, xmax=end,
           ymin=group, ymax=group,
           col=color)) +
  scale_x_date() + 
  geom_rect(linewidth=3)

请注意,第二个事件绘制在第一个事件的顶部,因此用户看不到它:

plot of the timeline with first event not being visible

如何使这两个事件都可见?

我try 了ggplot2提供的所有位置调整,希望它们中的任何一个都能在显示正确的开始日期和结束日期的同时绘制两个事件.position_dodge()听起来像是自然而然的 Select ,但它会改变事件在x轴上的位置,从而使情节变得不正确.

推荐答案

一种 Select 是使用geom_linerangeposition_dodge:

library(ggplot2)

ggplot(
  events,
  aes(
    xmin = start, xmax = end,
    y = group,
    color = color
  )
) +
  scale_x_date() +
  geom_linerange(
    linewidth = 3,
    position = position_dodge(width = .25)
  )

R相关问答推荐

在ggplot的注释表格中突出显示最大值

使用ggplot 2根据R中的类别排列Likert比例gplot

Highcharter多次钻取不起作用,使用不同方法

通过使用str_detect对具有相似字符串的组进行分组

线性模型斜率在减少原始数据时提供NA

R spatstat Minkowski Sum()返回多个边界

仅 Select 超过9行的CSV文件

比较理论阿尔法和经验阿尔法

将二进制数据库转换为频率表

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

如何在科学记数法中显示因子

R:用GGPLATE,如何在两个独立的变量中制作不同形状的散点图?

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

减go R中列表的所有唯一元素对

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

自定义交互作用图的标签

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

如何使用grepl()在数据帧列表中 Select 特定字符串?

R/shiny APP:如何充分利用窗口?

将R中对象的CSV数组转换为JSON数组