如何用Python可视化展示两列数据的同向变化关联
问题根因
你选的图表类型和分析目标不匹配:柱状图的适用场景是对比离散分类项的数值大小,而你要分析的BodyTemp、SpO2都是连续数值变量,直接把每条样本的体温值作为x轴分类画柱状图,样本量稍大必然会出现柱体紧挨、重叠的问题,根本没法体现两个变量的关联规律。
推荐实现方案
分析两个连续变量的关联特征,首选散点图,搭配拟合线可以直观看到两者的变化趋势,数据量大时给散点加透明度就能解决点重叠的问题。
import matplotlib.pyplot as plt import seaborn as sns # 基础散点图版本 plt.figure(figsize=(10, 6)) # alpha设置透明度,重叠区域颜色更深,能体现数据分布密度 plt.scatter(x=df["BodyTemp"], y=df["SpO2"], alpha=0.6) plt.xlabel("BodyTemp") plt.ylabel("SpO2") plt.show() # 带线性拟合线的版本,直接展示整体变化趋势 plt.figure(figsize=(10, 6)) # 红色线为线性拟合结果,斜率为正代表体温和血氧同步上升,斜率为负代表反向变化 sns.regplot(x=df["BodyTemp"], y=df["SpO2"], line_kws={"color": "red"}) plt.xlabel("BodyTemp") plt.ylabel("SpO2") plt.show()
如果偏好柱状图的展示形式,可以先对连续的体温值做分箱处理,按固定区间聚合计算每个区间的平均血氧后再绘图,就不会出现柱体过密的问题:
# 按0.5℃的步长切分体温区间 df["temp_range"] = pd.cut( df["BodyTemp"], bins=np.arange(df["BodyTemp"].min(), df["BodyTemp"].max() + 0.5, 0.5) ) # 计算每个体温区间的平均血氧 agg_df = df.groupby("temp_range")["SpO2"].mean().reset_index() plt.figure(figsize=(10, 6)) plt.bar(x=agg_df["temp_range"].astype(str), height=agg_df["SpO2"]) plt.xlabel("BodyTemp range") plt.ylabel("Average SpO2") plt.xticks(rotation=45) # 旋转x轴标签避免文字重叠 plt.show()
补充量化校验
可视化之外可以直接计算两个字段的皮尔逊相关系数,量化关联程度:
pearson_corr = df["BodyTemp"].corr(df["SpO2"]) print(f"体温与血氧的皮尔逊相关系数为:{pearson_corr:.2f}")
相关系数取值范围为-1到1:正值代表正相关(体温升高时血氧同步上升),负值代表负相关,绝对值越接近1说明线性关联越强。
内容的提问来源于stack exchange,提问作者l15
相关产品推荐
相关产品推荐

