You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R绘制条形宽度随变量变化的时间轴?

实现条形宽度随变量动态变化的时间轴

由于vistime包的linewidth参数仅支持单一数值,无法直接实现条形宽度随变量n动态调整的需求,推荐使用ggplot2自定义绘制这类时间轴,灵活性更高。

以下是完整的实现代码:

library(lubridate)
library(ggplot2)

# 准备数据
df <- data.frame(
  debut = c(rep(2010,3), rep(2011,2), 2012),
  fin = c(2011,2012,2013,2012,2013,2013),
  n = c(3,1,2,6,7,5),
  event = paste("n =", c(3,1,2,6,7,5), sep=" "),
  color = c("#D73027", "#F46D43", "#FDAE61", "#FEE08B", "#D9EF8B", "#A6D96A")
)
df$debut <- ymd(df$debut, truncated = 2L)
df$fin <- ymd(df$fin, truncated = 2L)

# 为每个事件分配y轴位置,同时基于n计算条形的上下边界
df <- df %>% 
  mutate(
    y = row_number(),  # 每个事件对应一个y轴位置
    y_min = y - n/10,  # 缩放n值作为条形的高度范围,可调整分母控制缩放比例
    y_max = y + n/10
  )

# 绘制时间轴
ggplot(df) +
  geom_rect(
    aes(xmin = debut, xmax = fin, ymin = y_min, ymax = y_max, fill = I(color)),
    alpha = 0.8
  ) +
  geom_text(
    aes(x = (debut + fin)/2, y = y, label = event),
    size = 4, color = "black"
  ) +
  scale_x_date(date_labels = "%Y", date_breaks = "1 year") +
  ylab("事件") +
  xlab("年份") +
  theme_minimal() +
  theme(
    axis.text.y = element_blank(),  # 隐藏y轴刻度文本
    axis.ticks.y = element_blank(),
    panel.grid.major.y = element_blank()
  )

代码说明:

  • 用geom_rect绘制每个时间区间的条形,通过ymin和ymax基于n值动态调整条形的高度(对应横向时间轴的条形宽度观感),可以通过调整n/10中的分母来控制缩放程度,让条形宽度更符合需求。
  • I(color)直接使用数据框中的颜色值,无需映射到颜色比例尺。
  • 添加事件标签到每个条形的中间位置,优化可读性。
  • 调整主题样式,让时间轴更简洁美观。

内容的提问来源于stack exchange,提问作者vaaaaaal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:56:31