如何按Method类别分别绘制包含所有CSV文件数据的散点图?
解决方案
核心逻辑是先把3个CSV的数据合并,新增字段标记数据来源,再按Method分组绘图即可。
完整代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from pathlib import Path ROOT = Path(__file__).resolve().parent CSVS = [ ROOT / "CSV_1.csv", ROOT / "CSV_2.csv", ROOT / "CSV_3.csv", ] # 自定义三个CSV对应的标记样式,可替换为+、*、x等你需要的样式 MARKERS = ["o", "s", "^"] # 自定义数据来源的显示名称,可按需求修改 SOURCE_LABELS = { "CSV_1": "数据集1", "CSV_2": "数据集2", "CSV_3": "数据集3" } def plot_per_method(): # 合并所有CSV数据,新增source列标记来源 total_data = [] for csv_path in CSVS: df = pd.read_csv(csv_path) df["source"] = SOURCE_LABELS.get(csv_path.stem, csv_path.stem) total_data.append(df) total_df = pd.concat(total_data, ignore_index=True) # 遍历所有唯一的Method生成对应图表 for method in total_df["Method"].unique(): method_df = total_df[total_df["Method"] == method] plt.figure(figsize=(8, 8)) sns.scatterplot( x="EC", y="MAE", data=method_df, hue="source", # 用颜色区分来源 style="source", # 用标记区分来源 markers=MARKERS, s=100 # 调大点位大小更清晰 ) # 修正原代码坐标轴标签和实际变量不匹配的问题 plt.title(f"MAE vs EC ({method})") plt.xlabel("EC") plt.ylabel("MAE") plt.legend(title="数据来源") plt.savefig(f"{method}.png", dpi=300, bbox_inches="tight") plt.close() if __name__ == "__main__": plot_per_method()
自定义调整说明
- 如果只需要用颜色区分来源,删除
sns.scatterplot中的style和markers参数即可 - 如果只需要用标记区分来源,删除
hue参数即可 - 输出的4张图片会以对应Method的名称命名,保存在脚本同级目录
内容的提问来源于stack exchange,提问作者Opps_0
相关产品推荐
相关产品推荐

