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

使用ggplot可视化研究人群:图表样式优化求助

问题描述

尝试用ggplot可视化研究人群,当前生成的散点图效果不理想,希望实现两个目标:

  1. 将散点改为线条连接队列轨迹(比如展示1945年出生队列在50-75岁的完整随访轨迹),并能对特定队列添加高亮效果;
  2. 尝试绘制堆叠面积图但图表为空,需要解决这个问题。

当前使用的代码如下:

# 绘图
ggplot(df_sample, aes(x = year, y = age, color = as.factor(fodelsear))) +
  geom_point(size = 2) +  # 在线上添加点
  labs(
    title = "Study Population",
    x = "Follow-up Year",
    y = "Age",
    color = "Birth Cohort"  
  ) +
 #scale_color_manual(values = custom_palette) +  # 应用自定义调色板
  theme_minimal() +  # 应用简洁主题
  theme(
    plot.title = element_text(hjust = 0.5),  # 标题居中
    axis.text.x = element_text(angle = 45, hjust = 1),  # X轴标签倾斜45度
    legend.title = element_text(hjust = 0.5),  # 图例标题居中
    legend.text = element_text(size = 10),  # 按需调整图例文字大小
    legend.position = "right"  # 按需设置图例位置
  )

解决方案

一、用线条连接队列轨迹并添加高亮

要连接每个出生队列的随访点,只需添加geom_line并通过group参数指定按出生队列分组;高亮特定队列可以单独叠加一层线条/点,设置更醒目的样式。

修改后的代码示例:

library(ggplot2)
# 如需高亮特定队列,加载dplyr用于数据筛选
library(dplyr)

ggplot(df_sample, aes(x = year, y = age, color = as.factor(fodelsear), group = as.factor(fodelsear))) +
  # 绘制所有队列的基础线条和点
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  # 高亮1945年出生队列(示例)
  geom_line(data = df_sample %>% filter(fodelsear == 1945), 
            linewidth = 2, color = "#E63946") +
  geom_point(data = df_sample %>% filter(fodelsear == 1945), 
             size = 3, color = "#E63946") +
  labs(
    title = "Study Population",
    x = "Follow-up Year",
    y = "Age",
    color = "Birth Cohort"  
  ) +
  # scale_color_manual(values = custom_palette) +  # 可启用自定义调色板
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.title = element_text(hjust = 0.5),
    legend.text = element_text(size = 10),
    legend.position = "right"
  )

关键说明:

  • group = as.factor(fodelsear):确保ggplot按出生队列分组连接点,避免线条混乱;
  • 高亮部分通过data参数筛选目标队列,用更粗的线条、鲜艳的颜色区分,也可添加alpha参数调整透明度。

二、修复堆叠面积图为空的问题

堆叠面积图的核心是y轴需要代表每个分组在x轴位置的量化值(比如该年份该队列的人数、比例),你当前的y轴是age,不符合堆叠面积图的逻辑,导致图表为空。

步骤1:预处理数据,统计每个年份+队列的人数

library(dplyr)

# 统计每个随访年份、每个出生队列的参与人数
df_area <- df_sample %>%
  group_by(year, fodelsear) %>%
  summarise(pop_count = n(), .groups = "drop")

步骤2:绘制堆叠面积图

ggplot(df_area, aes(x = year, y = pop_count, fill = as.factor(fodelsear))) +
  geom_area(position = "stack", alpha = 0.8) +
  labs(
    title = "Study Population Distribution by Birth Cohort",
    x = "Follow-up Year",
    y = "Number of Participants",
    fill = "Birth Cohort"  
  ) +
  # scale_fill_manual(values = custom_palette) +  # 可启用自定义调色板
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.title = element_text(hjust = 0.5),
    legend.text = element_text(size = 10),
    legend.position = "right"
  )

关键说明:

  • position = "stack":默认的堆叠方式,也可用position = "fill"将y轴转为比例;
  • 如果统计后pop_count为0,也会导致图表为空,需要检查数据统计逻辑是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:57:26