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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:03:25