如何使用sns.scatterplot绘制多组Hours与GPA的关系散点图
解决方法
你的问题根源在于数据集格式不匹配:CSV里包含3组重复的Hours和GPA列,pandas读取后会自动为重复列名添加后缀(比如Hours.1、GPA.1等),但你的代码仅调用了原始的Hours和GPA列,因此只绘制了第一组数据。
要展示所有3组Hours与GPA的关系,需要先把宽格式数据转成长格式(tidy data),再用seaborn绘制:
步骤1:修正数据加载与格式转换
# Author: Evan Gertis # Date : 11/09 # program: Linear Regression import seaborn as sns import pandas as pd import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # Step 1: 加载数据并手动指定列名,避免自动生成后缀 col_names = ["Hours_1", "GPA_1", "Hours_2", "GPA_2", "Hours_3", "GPA_3"] grades = pd.read_csv("grades.csv", names=col_names, header=0) logging.info(grades.head()) # Step 2: 把3组数据合并成长格式 tidy_grades = pd.DataFrame() for group_num in range(1, 4): # 提取当前组的列并统一重命名 group_data = grades[[f"Hours_{group_num}", f"GPA_{group_num}"]] group_data = group_data.rename(columns={ f"Hours_{group_num}": "Hours", f"GPA_{group_num}": "GPA" }) # 添加组别标记,方便后续区分 group_data["Group"] = f"Group {group_num}" # 拼接到总数据框 tidy_grades = pd.concat([tidy_grades, group_data], ignore_index=True)
步骤2:绘制所有组的散点图
现在可以基于长格式数据绘制所有组的关系,还能通过颜色区分不同组别:
# Step 3: 绘制带组别区分的散点图 plot = sns.scatterplot(data=tidy_grades, x="Hours", y="GPA", hue="Group") # 优化图表标签与标题 plot.set_title("Hours vs GPA (All Groups)") plot.set_xlabel("Study Hours") plot.set_ylabel("GPA") fig = plot.get_figure() fig.savefig("out_all_groups.png")
补充说明
- 如果不需要区分组别,只想把所有数据点叠加展示,直接去掉
hue="Group"参数即可 - 长格式数据是seaborn等可视化工具的通用适配格式,能大幅提升多组数据的处理灵活性
内容的提问来源于stack exchange,提问作者Evan Gertis
相关产品推荐
相关产品推荐

