如何用for循环在同一张图绘制多条不同颜色的ROC曲线?
解决ROC曲线颜色重复问题
你的问题根源在于代码里固定了'b'(蓝色)作为所有曲线的颜色,所以每条ROC曲线都显示相同颜色,而且图例仅标注AUC值,无法区分对应模型。下面提供两种实用的解决方法:
方法一:自定义颜色列表(精确控制配色)
先创建一个与模型数量匹配的颜色列表,通过zip将模型和颜色一一绑定,同时把模型名称加入图例标签,方便识别:
models = { "KNN": KNeighborsClassifier(n_neighbors = 10), "Logistic Regression": LogisticRegression(), "Decision Tree": DecisionTreeClassifier(), "SVM": SVC(probability=True)} # 自定义颜色列表,数量与模型数一致,可按需调整配色 colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'] for (name, model), color in zip(models.items(), colors): model.fit(X_train_scaled, y_train) y_scores = model.predict_proba(X_test_scaled) fpr, tpr, threshold = roc_curve(y_test, y_scores[:, 1]) roc_auc = auc(fpr, tpr) # 使用对应颜色,并在标签中加入模型名称 plt.plot(fpr, tpr, color=color, label=f'{name} (AUC = {roc_auc:.2f})') plt.title('Receiver Operating Characteristic') plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel('True Positive Rate') plt.xlabel('False Positive Rate') plt.show()
方法二:利用Matplotlib自动颜色循环(简洁优雅)
Matplotlib默认自带颜色循环机制,只需移除代码中固定的'b'参数,它就会自动为每条曲线分配不同颜色,无需手动管理颜色列表:
models = { "KNN": KNeighborsClassifier(n_neighbors = 10), "Logistic Regression": LogisticRegression(), "Decision Tree": DecisionTreeClassifier(), "SVM": SVC(probability=True)} for name, model in models.items(): model.fit(X_train_scaled, y_train) y_scores = model.predict_proba(X_test_scaled) fpr, tpr, threshold = roc_curve(y_test, y_scores[:, 1]) roc_auc = auc(fpr, tpr) # 去掉固定颜色,让Matplotlib自动分配配色 plt.plot(fpr, tpr, label=f'{name} (AUC = {roc_auc:.2f})') plt.title('Receiver Operating Characteristic') plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel('True Positive Rate') plt.xlabel('False Positive Rate') plt.show()
额外优化建议
- 图例标签加入模型名称后,可直接对应每条曲线的模型,避免混淆;
- 若后续扩展模型数量,方法二中的自动颜色循环会自动适配,无需修改颜色列表;
- 若想全局自定义颜色循环,可使用
plt.gca().set_prop_cycle(color=your_color_list)来设置。
内容的提问来源于stack exchange,提问作者Tim Starr
相关产品推荐
相关产品推荐

