如何绘制以列名为X轴的多列图表?附DataFrame示例
解决时序DataFrame多列图表绘制问题(X轴为列名)
看起来你遇到的核心问题是宽格式时序数据的可视化适配和数据本身的异常/缺失值干扰,我来一步步帮你解决:
首先分析你现有数据的问题点
从你给出的样本数据来看:
- 存在缺失值(
NaN),这会导致绘图时出现断裂或不完整的元素 - 部分数据点差异极大(比如第一行的
NfL_V12值达到40+,远高于其他样本),会拉高整体Y轴范围,让其他数据的细节被压缩 - 直接用宽格式(每列一个时间点)绘图时,大部分可视化库会把每行当作一个独立系列,导致图表过于杂乱
解决方案步骤
1. 数据预处理:宽格式转长格式 + 处理缺失值
把你的宽表转换成长格式是可视化的关键——这样我们能把"时间点(列名)"作为X轴的分类变量,把"NfL数值"作为Y轴的连续变量,适配绝大多数绘图库的要求。
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 假设你的DataFrame名为nfl # 转换为长格式:列名转为Time_Point列,数值转为NfL_Value列 df_long = nfl.melt(var_name="Time_Point", value_name="NfL_Value") # 处理缺失值:两种可选方式 # 方式1:直接删除含缺失值的行(简单快速) df_clean = df_long.dropna() # 方式2:用对应时间点的均值填充缺失值(保留更多样本) # df_clean = df_long.copy() # df_clean['NfL_Value'] = df_clean.groupby('Time_Point')['NfL_Value'].transform(lambda x: x.fillna(x.mean()))
2. 选择适合的图表类型(按需求选)
根据你想展示的信息,推荐以下几种图表:
🔹 箱线图:展示每个时间点的数据分布
适合比较不同时间点的数值范围、中位数和异常值:
plt.figure(figsize=(12, 6)) sns.boxplot(data=df_clean, x="Time_Point", y="NfL_Value") plt.title("NfL Distribution Across Time Points") plt.xlabel("Time Point") plt.ylabel("NfL Value") plt.xticks(rotation=45) # 旋转X轴标签避免重叠 plt.show()
🔹 均值误差棒图:展示整体时序趋势
如果想突出每个时间点的平均水平和波动,用带标准差/标准误的折线图:
# 先计算每个时间点的均值和标准差 df_summary = nfl.agg(["mean", "std"]).T.reset_index() df_summary.columns = ["Time_Point", "Mean_NfL", "Std_NfL"] plt.figure(figsize=(12, 6)) plt.errorbar( data=df_summary, x="Time_Point", y="Mean_NfL", yerr="Std_NfL", fmt="-o", capsize=5, color="#2ecc71" ) plt.title("Mean NfL with Standard Deviation Over Time") plt.xlabel("Time Point") plt.ylabel("Mean NfL Value") plt.xticks(rotation=45) plt.grid(True, alpha=0.3) plt.show()
🔹 散点/蜂群图:展示个体样本的差异
如果想看清每个样本在不同时间点的表现,用蜂群图(避免点重叠):
plt.figure(figsize=(12, 6)) sns.swarmplot(data=df_clean, x="Time_Point", y="NfL_Value", size=4) plt.title("Individual NfL Values Across Time Points") plt.xlabel("Time Point") plt.ylabel("NfL Value") plt.xticks(rotation=45) plt.show()
3. 优化:处理异常值
如果某个极端值(比如第一行的40+)导致图表比例失调,可以用四分位数法过滤异常值:
# 计算四分位数和IQR Q1 = df_clean["NfL_Value"].quantile(0.25) Q3 = df_clean["NfL_Value"].quantile(0.75) IQR = Q3 - Q1 # 过滤异常值(保留在Q1-1.5IQR到Q3+1.5IQR之间的数据) df_filtered = df_clean[(df_clean["NfL_Value"] >= Q1 - 1.5*IQR) & (df_clean["NfL_Value"] <= Q3 + 1.5*IQR)] # 重新绘制箱线图查看效果 plt.figure(figsize=(12, 6)) sns.boxplot(data=df_filtered, x="Time_Point", y="NfL_Value") plt.title("NfL Distribution (Outliers Removed) Across Time Points") plt.xlabel("Time Point") plt.ylabel("NfL Value") plt.xticks(rotation=45) plt.show()
总结
- 宽转长是适配X轴为列名的核心操作,让可视化逻辑更清晰
- 根据你的分析目标选择对应图表:看分布用箱线,看趋势用均值误差棒,看个体用蜂群图
- 缺失值和异常值是图表效果差的常见原因,针对性处理后会大幅提升可读性
内容的提问来源于stack exchange,提问作者Matheus Zschornack Strelow
相关产品推荐
相关产品推荐

