在R中绘制纵向数据:按性别展示抑郁随时间趋势的问题
我太懂这种被一堆杂乱线条支配的烦恼了!本来想清晰展示男女群体的抑郁水平趋势,结果出来每个ID一条线,完全看不到群体规律对吧?别慌,咱们分两种常用工具来解决这个问题——R的ggplot2和Python的Seaborn,都是可视化的好手。
用R的ggplot2实现
首先咱们得先把数据按性别和时间分组,算出每个群体在每个时间点的抑郁水平均值(毕竟每个时间点有多个个体数据,均值才能代表群体趋势):
# 加载必要的包 library(tidyverse) # 假设你的数据框叫df df <- data.frame( ID = c(1,1,1,2,2,2,3,3,3), DEPRESSION = c(5,5,4,3,6,8,2,2,2), TIME = c(1,2,3,1,2,3,1,2,3), GENDER = c("MALE","MALE","MALE","MALE","MALE","MALE","FEMALE","FEMALE","FEMALE") ) # 先聚合数据:按性别和时间分组,计算平均抑郁水平 grouped_df <- df %>% group_by(GENDER, TIME) %>% summarise(MEAN_DEPRESSION = mean(DEPRESSION), .groups = "drop") # 绘制趋势线 ggplot(grouped_df, aes(x = TIME, y = MEAN_DEPRESSION, color = GENDER)) + geom_line(linewidth = 1) + # 绘制趋势线 geom_point(size = 2) + # 添加每个时间点的均值点 labs(title = "抑郁水平随时间变化的群体趋势", x = "时间点", y = "平均抑郁水平", color = "性别") + theme_minimal()
这里关键是先聚合数据,把每个性别每个时间点的均值算出来,而不是直接用原始数据绘图——原始数据里每个ID的重复测量会导致ggplot默认按个体分组,画出一堆线条。
用Python的Seaborn实现
Seaborn其实很贴心,默认就会帮你处理分组均值的计算,不过咱们也可以先手动聚合确保清晰:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 构造数据框 df = pd.DataFrame({ "ID": [1,1,1,2,2,2,3,3,3], "DEPRESSION": [5,5,4,3,6,8,2,2,2], "TIME": [1,2,3,1,2,3,1,2,3], "GENDER": ["MALE","MALE","MALE","MALE","MALE","MALE","FEMALE","FEMALE","FEMALE"] }) # 方法一:手动聚合数据 grouped_df = df.groupby(["GENDER", "TIME"])["DEPRESSION"].mean().reset_index() sns.lineplot(data=grouped_df, x="TIME", y="DEPRESSION", hue="GENDER", linewidth=2, marker="o") plt.title("抑郁水平随时间变化的群体趋势") plt.xlabel("时间点") plt.ylabel("平均抑郁水平") plt.show() # 方法二:直接用Seaborn自动计算均值(更简便) sns.lineplot(data=df, x="TIME", y="DEPRESSION", hue="GENDER", estimator="mean", linewidth=2, marker="o") plt.title("抑郁水平随时间变化的群体趋势") plt.xlabel("时间点") plt.ylabel("平均抑郁水平") plt.show()
这里的estimator="mean"就是告诉Seaborn,对每个性别每个时间点的所有数据取均值来绘制趋势线,避免了每个ID单独成线的问题。
小提醒
你之前可能不小心把ID映射到了group或者color参数里,导致绘图工具按个体分组。只要确保分组依据是GENDER,并且基于群体均值来画,就能得到你想要的两条清晰趋势线啦!
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

