如何使用折线图可视化展示同一DataFrame中两列变量的相关性
原代码问题分析
- 核心逻辑错误:你调用
plt.plot(df_corr,'--')是对2×2的相关系数矩阵绘图,该矩阵仅包含1、-0.99、-0.99、1四个值,输出的折线和两个原始变量的实际变化趋势完全无关,这是你无法理解输出的根本原因 - 语法错误:你已经将
x、y赋值为df的列(Series格式),后续df1[[x, y]]写法不符合pandas索引规则,且df1未定义,正常运行会直接报错
正确实现方式
如果要通过折线图直观体现两个变量的相关性,首先需要消除两个变量的量纲差异(分数取值0-100、用时取值为分钟级,直接绘图看不到趋势关联),可以先做min-max归一化后再绘制双折线对比趋势,也可以搭配更通用的散点+拟合线方案组合验证:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 构造示例df,实际使用时替换为你的数据源即可 df = pd.DataFrame({ 'mark': [92,92,32,95], 'time': [130,120,175,120] }) # 打印相关系数值确认 corr_val = df['mark'].corr(df['time']).round(2) print(f"mark和time的相关系数为:{corr_val}") # 方案1:归一化双折线图,直观对比趋势 # 对两列做min-max归一化,取值范围统一到0-1 df_norm = (df - df.min()) / (df.max() - df.min()) # 按mark排序让趋势展示更连贯 df_norm = df_norm.sort_values('mark').reset_index(drop=True) plt.figure(figsize=(8,4)) plt.plot(df_norm['mark'], label='分数(归一化)', marker='o') plt.plot(df_norm['time'], label='用时(归一化)', marker='s', linestyle='--') plt.title(f'分数与用时趋势对比(相关系数{corr_val})') plt.legend() plt.show() # 方案2:散点+拟合线,行业通用的相关性展示方式 plt.figure(figsize=(8,4)) plt.scatter(df['mark'], df['time'], label='原始数据点') # 绘制线性拟合线 z = np.polyfit(df['mark'], df['time'], 1) p = np.poly1d(z) plt.plot(df['mark'], p(df['mark']), 'r--', label=f'拟合线,斜率{z[0].round(2)}') plt.xlabel('分数') plt.ylabel('用时(分钟)') plt.title(f'分数与用时相关性散点图') plt.legend() plt.show()
结果说明
归一化折线图可以看到分数上升的同时,用时明显同步下降,完美匹配-0.986的强负相关特征;散点图的拟合线斜率为负,也可以直接验证负相关关系。
内容的提问来源于stack exchange,提问作者Cressy de borbon
相关产品推荐
相关产品推荐

