如何在Python中为多目标优化结果绘制Pareto Front Line?
实现帕累托前沿(Pareto Front)绘制方案
核心思路
先从数据中筛选出帕累托最优的点,再在原有散点图基础上叠加前沿折线。以下是针对最小化fun1和fun2目标的实现逻辑(最大化目标只需调整判断条件):
完整代码
import seaborn as sns import pandas as pd import matplotlib.pyplot as plt # 读取Excel数据 df = pd.read_excel('file path') # 提取帕累托前沿点(最小化双目标场景) # 先按fun1升序排序 df_sorted = df.sort_values(by='fun1', ascending=True) pareto_front = [] min_fun2 = float('inf') # 遍历筛选:仅保留fun2比之前所有点更小的记录 for _, row in df_sorted.iterrows(): if row['fun2'] < min_fun2: pareto_front.append(row) min_fun2 = row['fun2'] df_pareto = pd.DataFrame(pareto_front) # 绘制原始散点图 sns.scatterplot(x='fun1', y='fun2', data=df, hue='alpha', legend=False) # 叠加帕累托前沿折线 plt.plot(df_pareto['fun1'], df_pareto['fun2'], color='red', linewidth=2, label='Pareto Front') # 配置图表样式 plt.xlabel('fun1', fontsize=16) plt.ylabel('fun2', fontsize=16) plt.legend(fontsize=12) plt.show()
适配最大化目标的修改
如果你的需求是最大化fun1和fun2,只需调整以下两处:
- 排序改为降序:
df_sorted = df.sort_values(by='fun1', ascending=False) - 初始化和判断条件改为:
max_fun2 = -float('inf')、if row['fun2'] > max_fun2:
内容的提问来源于stack exchange,提问作者Yousef
相关产品推荐
相关产品推荐

