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

如何用Matplotlib/Seaborn在单张图中绘制多条独立曲线?

问题描述

我的DataFrame包含classes、DeptAvg、week1、week2、week3等列(classes含COA111类别,DeptAvg及各week列均为数值型数据)。我尝试用以下代码绘制多条曲线:

plt.plot(LessDF['DeptAvg'][LessDF['classes'] == 'COA111'], LessDF['week1'])
plt.plot(LessDF['DeptAvg'][LessDF['classes'] == 'COA111'], LessDF['week2'])
plt.plot(LessDF['DeptAvg'][LessDF['classes'] == 'COA111'], LessDF['week3'])

但运行后仅显示一条线,想要实现多条独立区分的曲线效果,请问如何用Matplotlib或Seaborn实现?

一、Matplotlib 实现方案

你当前代码只显示一条线的核心原因是:三次绘图共用了完全相同的DeptAvg作为x轴,若week1/week2/week3的数据点重合,就会导致线条重叠。以下是两种可行解决方法:

方法1:转换为长格式数据(推荐)

将宽格式的DataFrame转为长格式,更便于批量处理和绘图:

import pandas as pd
import matplotlib.pyplot as plt

# 筛选COA111的目标数据
coa_subset = LessDF[LessDF['classes'] == 'COA111'].copy()
# 转换长格式:把week1/week2/week3转为"Week"类别和"Score"数值
melted_df = pd.melt(coa_subset, 
                    id_vars=['DeptAvg'], 
                    value_vars=['week1', 'week2', 'week3'],
                    var_name='Week', 
                    value_name='Score')

# 绘制每条Week的曲线
plt.figure(figsize=(10, 6))
for week_label in melted_df['Week'].unique():
    week_data = melted_df[melted_df['Week'] == week_label]
    plt.plot(week_data['DeptAvg'], week_data['Score'], label=week_label)

# 添加图表元素
plt.xlabel('DeptAvg')
plt.ylabel('Score')
plt.title('COA111 Weekly Scores vs DeptAvg')
plt.legend()
plt.show()

方法2:手动设置线条样式

如果不想转换数据结构,可以直接为每条线指定不同的颜色、线型,同时确认各week列数据是否存在差异(若数据完全相同,线条仍会重叠):

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
# 为每条线设置独立样式
plt.plot(LessDF['DeptAvg'][LessDF['classes'] == 'COA111'], LessDF['week1'], 
         color='tab:blue', linestyle='-', label='week1')
plt.plot(LessDF['DeptAvg'][LessDF['classes'] == 'COA111'], LessDF['week2'], 
         color='tab:red', linestyle='--', label='week2')
plt.plot(LessDF['DeptAvg'][LessDF['classes'] == 'COA111'], LessDF['week3'], 
         color='tab:green', linestyle=':', label='week3')

# 添加图表元素
plt.xlabel('DeptAvg')
plt.ylabel('Score')
plt.title('COA111 Weekly Scores vs DeptAvg')
plt.legend()
plt.show()

二、Seaborn 实现方案

Seaborn对长格式数据支持更友好,代码更简洁,自动处理样式和图例:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 先转换为长格式数据
coa_subset = LessDF[LessDF['classes'] == 'COA111'].copy()
melted_df = pd.melt(coa_subset, 
                    id_vars=['DeptAvg'], 
                    value_vars=['week1', 'week2', 'week3'],
                    var_name='Week', 
                    value_name='Score')

# 绘制曲线
plt.figure(figsize=(10, 6))
sns.lineplot(data=melted_df, x='DeptAvg', y='Score', hue='Week', style='Week')
plt.title('COA111 Weekly Scores vs DeptAvg')
plt.show()

内容的提问来源于stack exchange,提问作者Dipam Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:00:58