如何在Python中绘制多分类器在多组数据集上的准确率对比图
Python绘制二分类器多组合准确率分组柱状图方法
1. 安装所需依赖
你需要提前安装三个核心工具库,执行以下命令安装:
pip install pandas matplotlib seaborn
如果还需要自行完成分类任务计算准确率,可以额外安装scikit-learn:
pip install scikit-learn
2. 整理准确率数据
你需要先完成所有分类实验得到结果:10组「单个攻击+良性」的组合,每组对应3个分类器的准确率数值。可以直接替换下方代码中的模拟数据为你的真实值:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 模拟数据,可替换为你的真实数据 attack_names = [f"攻击{i+1}" for i in range(10)] # 10个攻击的名称,可自定义为你实际的攻击名 classifier_names = ["分类器A", "分类器B", "分类器C"] # 3个分类器的名称 # 准确率数据,shape为[10组攻击, 3个分类器],数值范围0~1或者0~100都可以 accuracy_data = [ [0.92, 0.88, 0.95], [0.87, 0.82, 0.89], [0.94, 0.90, 0.96], [0.78, 0.75, 0.81], [0.91, 0.87, 0.93], [0.85, 0.81, 0.87], [0.93, 0.89, 0.95], [0.89, 0.84, 0.91], [0.90, 0.86, 0.92], [0.83, 0.79, 0.86] ] # 转换为绘图需要的DataFrame格式 df_list = [] for attack_idx, attack in enumerate(attack_names): for cls_idx, cls in enumerate(classifier_names): df_list.append({ "攻击组合": attack, "分类器": cls, "准确率": accuracy_data[attack_idx][cls_idx] }) df = pd.DataFrame(df_list)
3. 绘制分组柱状图
# 设置绘图样式 sns.set_style("whitegrid") plt.rcParams["font.sans-serif"] = ["SimHei"] # 解决中文显示问题 plt.rcParams["axes.unicode_minus"] = False plt.figure(figsize=(14, 6)) # 调整画布大小 # 绘制分组柱状图 ax = sns.barplot(data=df, x="攻击组合", y="准确率", hue="分类器", palette="viridis") # 添加图表元素 ax.set_title("各攻击与良性数据组合下的分类器准确率", fontsize=14, pad=20) ax.set_xlabel("攻击+良性组合类型", fontsize=12) ax.set_ylabel("准确率", fontsize=12) plt.xticks(rotation=30) # 旋转x轴标签避免重叠 plt.ylim(0, 1.1) # 如果你的准确率是百分比(0~100),这里改成0, 110即可 # 可选:在柱子上方显示准确率数值 for p in ax.patches: height = p.get_height() ax.text(p.get_x() + p.get_width()/2., height + 0.01, f"{height:.2f}", ha='center', va='bottom', fontsize=10) plt.tight_layout() # 自动调整布局避免元素被截断 # plt.savefig("分类器准确率对比.png", dpi=300) # 可选:保存为本地图片 plt.show()
可自定义调整项
- 替换
palette参数可以修改柱子的配色,可选值比如Blues、Reds、Set2等 - 修改
figsize参数调整画布的宽高 - 修改
xticks的rotation值调整x轴标签的旋转角度 - 如果你使用百分比准确率,需要把
ylim改为(0, 110),同时数值显示的代码里height + 0.01改为height + 1
内容的提问来源于stack exchange,提问作者Zara
相关产品推荐
相关产品推荐

