如何用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
相关产品推荐
相关产品推荐

