Scikit-learn示例图表图例缺失标记问题咨询
解决Scikit-learn决策边界图例缺失标记的问题
问题核心:示例代码中通过DecisionBoundaryDisplay生成的决策边界,直接将其surface_.collections[0]传入plt.legend()时,图例只会显示文字,无法渲染对应线条的颜色和样式标记。这是因为contour方法生成的是ContourCollection对象,matplotlib的图例组件无法自动将其识别为可展示的线条元素。
解决方案:手动创建自定义图例条目
通过matplotlib.lines.Line2D手动构建图例所需的线条对象,明确指定颜色、线型等属性,确保图例能正确显示对应标记。
修改后的完整代码如下:
import matplotlib.pyplot as plt from matplotlib.lines import Line2D from sklearn import svm from sklearn.datasets import make_blobs from sklearn.inspection import DecisionBoundaryDisplay # 生成数据集 n_samples_1 = 1000 n_samples_2 = 100 centers = [[0.0, 0.0], [2.0, 2.0]] clusters_std = [1.5, 0.5] X, y = make_blobs( n_samples=[n_samples_1, n_samples_2], centers=centers, cluster_std=clusters_std, random_state=0, shuffle=False, ) # 训练模型 clf = svm.SVC(kernel="linear", C=1.0) clf.fit(X, y) wclf = svm.SVC(kernel="linear", class_weight={1: 10}) wclf.fit(X, y) # 绘制样本点 plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors="k") # 绘制决策边界 ax = plt.gca() disp = DecisionBoundaryDisplay.from_estimator( clf, X, plot_method="contour", colors="k", levels=[0], alpha=0.5, linestyles=["-"], ax=ax, ) wdisp = DecisionBoundaryDisplay.from_estimator( wclf, X, plot_method="contour", colors="r", levels=[0], alpha=0.5, linestyles=["-"], ax=ax, ) # 创建自定义图例线条 custom_lines = [ Line2D([0], [0], color='k', linestyle='-', lw=2), Line2D([0], [0], color='r', linestyle='-', lw=2) ] # 添加图例 plt.legend(custom_lines, ["non weighted", "weighted"], loc="upper right") plt.show()
原理说明
Line2D是matplotlib原生的线条对象,图例组件可以直接识别并渲染其颜色、线型、线宽等属性。相比直接传入ContourCollection,手动构建Line2D能精准控制图例中显示的标记样式,完全匹配决策边界的视觉特征。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

