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

如何在ggplot中为同列数据的收缩压与舒张压绘制垂直线

解决ggplot中同一时间点收缩压与舒张压的垂直线绘制问题

我明白你现在的需求——要在每个观测时间点,把收缩压和舒张压用垂直线连起来,这确实是医院观察图表里的标准呈现方式。咱们可以通过数据格式转换 + 叠加线段图层来实现这个效果,具体步骤如下:

第一步:处理血压数据,转换为宽格式

你的原始数据是长格式(每条观测占一行),而绘制垂直线需要同一时间点的收缩压和舒张压在同一行,这样才能分别作为线段的起点(y)和终点(yend)。我们可以用tidyr::pivot_wider来完成格式转换:

# 加载需要的包
library(tidyr)
library(dplyr)
library(ggplot2)

# 过滤出血压相关的数据,并转换为宽格式
bp_data <- obs %>%
  filter(clinical_event %in% c("Systolic Blood Pressure", "Diastolic Blood Pressure")) %>%
  pivot_wider(
    names_from = clinical_event,
    values_from = value,
    id_cols = clinical_event_end_date_time
  )

这段代码会把同一时间点的收缩压和舒张压合并到一行,生成包含clinical_event_end_date_time、Systolic Blood Pressure、Diastolic Blood Pressure三列的数据框。

第二步:在原有图表上叠加垂直线

接下来,你只需要在原来的ggplot代码基础上,加上geom_segment图层,用处理好的bp_data来绘制垂直线:

obschart <- obs %>% 
  ggplot() +
  # 先画垂直线(放在点的下方,避免遮挡)
  geom_segment(
    data = bp_data,
    aes(
      x = clinical_event_end_date_time,
      xend = clinical_event_end_date_time,
      y = `Diastolic Blood Pressure`,
      yend = `Systolic Blood Pressure`
    ),
    color = "gray50", # 设置线段颜色,也可以根据需要调整
    linewidth = 0.8
  ) +
  # 原来的点图层
  geom_point(aes(x = clinical_event_end_date_time, y = value, shape = point_shape)) +
  ylab(label = "Value") +
  xlab(label = "Date / Time of observation")

obschart

代码解释:

  • geom_segment需要指定x和xend(这里都是同一个时间点,所以线段是垂直的),y是舒张压的值,yend是收缩压的值。
  • 把线段图层放在点图层之前,这样点会显示在线段上方,不会被遮挡。
  • 你可以根据需求调整线段的颜色、粗细等样式参数。

这样就能实现你想要的效果:每个时间点的收缩压和舒张压之间会有一条垂直的连接线,同时保留其他观测指标的点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:26:45