Code zum einzeichnen von Clustergrenzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Ich habe folgenden code zum plotten von Clustergrenzen geschrieben.
Mit einer DBSCAN Instanz von Sklearn werden die cluster gebildet. Da DBSCAN selbst keine predickt methode hat habe ich eine KNeighborsClassifier von sklearn verwendet um die bereiche predicten zu können. Beide modelle werden nach dem fitten meiner funktion (siehe unten) übergeben. Damit sollen die unterschiedlichen Bereiche unterschiedlich gefärbt und die grenze der Bereiche eingezeichnet werden.

Die bereiche werden zwar richtig eingefärbt. Die Grenze, welche mit der Funktion "plt.contour" geplottet werden soll, scheint zwar die richtige form zu haben ist aber um 90 grad gedreht.
Könnte mir bitte jemand helfen?

Code: Alles auswählen

def plotte_datapoints_mit_hintergrund(cluster_model, dbscan_model, feature, x_label, y_label, achsen):
    #1) zeichnet Datapoints
    plt.figure(figsize = (15,10))
    plt.xlabel(x_label, fontsize = 15)
    plt.ylabel(y_label, fontsize = 15)
    plot_dbscan(dbscan_model, feature)    # eigene Methode welche die Datapoints plottet (für die Frage eher unwichtig)
    
    #2) zeichne hintergrund
    x_achse_wertebereich = np.linspace(achsen[0], achsen[1],200)
    y_achse_wertebereich = np.linspace(achsen[2], achsen[3],200)

    alle_punkte = np.asarray(np.meshgrid(x_achse_wertebereich, y_achse_wertebereich))
    alle_punkte_reshapted = alle_punkte.T.reshape(-1,2)
    bereiche = cluster_model.predict(alle_punkte_reshapted)
    plt.scatter(alle_punkte_reshapted[:,0], alle_punkte_reshapted[:,1], c= bereiche, cmap = "Pastel1", alpha =0.1)
    
    #3) zeichne grenze
    # Z ist ein 2D Array, wobei die Zeilenanzahl entspricht  länge x-achse, Spaltenanzahl entspricht länge  y-achse
    Z = bereiche.reshape(len(x_achse_wertebereich),len(y_achse_wertebereich))
    plt.contour(Z, linewidths=1, extent = (achsen[0], achsen[1], achsen[2], achsen[3]))
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Ich habs. Z musste wohl nur transponiert werden. Wieso auch immer
Antworten