[Python] Wenn Sie ein Streudiagramm mehrerer Cluster zeichnen möchten

Zweck dieses Artikels

Beim Zeichnen eines Streudiagramms mehrerer Cluster können sich die Punkte überlappen und sind schwer zu erkennen. Aus diesem Grund habe ich ein Diagramm erstellt, das mit `` `Plotly``` Cluster für Cluster bestätigt werden kann.

plot.gif

Hintergrund

Wenn zum Beispiel solche Daten mit xy-Koordinaten vorhanden sind, die in 5 Cluster unterteilt sind,

image02.png

Mit `` `seaborn``` können Sie beispielsweise das folgende Diagramm in einer Linie zeichnen.

sns.scatterplot(x="x", y="y", hue="class", data=df)

image01.png

Es ist jedoch ein wenig schwierig zu erkennen, ob es oben bleibt. Geben Sie daher die Transparenz "Alpha" an.

sns.scatterplot(x="x", y="y", hue="class", data=df, alpha=0.5)

image02.png

Obwohl es sich ein wenig verbessert hat, ist es mit diesen Daten immer noch schwer zu erkennen.

Also dachte ich, es wäre schön, wenn ich die Cluster einzeln zeichnen könnte ... und versuchte, "Plotly" zu verwenden.

Kommentar

Bereiten Sie zuerst die Bibliothek vor,

import numpy as np
import pandas as pd

import seaborn as sns
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly

Dummy-Daten vorbereiten.

x0 = np.random.normal(2, 0.8, 400)
y0 = np.random.normal(2, 0.8, 400)
x1 = np.random.normal(3, 1.2, 600)
y1 = np.random.normal(6, 0.8, 600)
x2 = np.random.normal(4, 0.4, 200)
y2 = np.random.normal(4, 0.8, 200)
x3 = np.random.normal(1, 0.8, 300)
y3 = np.random.normal(3, 1.2, 300)
x4 = np.random.normal(1, 0.8, 300)
y4 = np.random.normal(5, 0.8, 300)

df = pd.DataFrame()

df["x"] = np.concatenate([x0, x1, x2, x3, x4])
df["y"] = np.concatenate([y0, y1, y2, y3, y4])
df["class"] = ["Cluster 0"]*400 + ["Cluster 1"]*600 + ["Cluster 2"]*200+ ["Cluster 3"]*300+ ["Cluster 4"]*300

Als nächstes der Handlungsteil des Hauptthemas, Ich zeige Ihnen zuerst den gesamten Code.

def plotly_scatterplot(x, y, hue, data, title=""):
    cluster = df[hue].unique()
    n_cluster = len(cluster)
    colors = plt.rcParams['axes.prop_cycle'].by_key()['color']

    fig = go.Figure()

    button = []
    tf = [True]*n_cluster
    tmp = dict(label="all",
               method="update",
               args=[{"visible": tf}]
               )
    button.append(tmp)

    for i,clu in enumerate(cluster):
        fig.add_trace(
            go.Scatter(
                x = df[df[hue]==clu][x],
                y = df[df[hue]==clu][y],
                mode="markers",
                name=clu,
                marker=dict(color=colors[i])
                )
            )

        tf = [False]*n_cluster
        tf[i] = True
        tmp = dict(label=clu,
                   method="update",
                   args=[{"visible": tf}]
                   )
        button.append(tmp)
    

    fig.update_layout(
        updatemenus=[
            dict(type="buttons",
                 x=1.15,
                 y=1,
                 buttons=button
                 )
            ])

    x_min = df[x].min()
    x_max = df[x].max()
    x_range = x_max - x_min
    y_min = df[y].min()
    y_max = df[y].max()
    y_range = y_max - y_min

    fig.update_xaxes(range=[x_min-x_range/10, x_max+x_range/10])
    fig.update_yaxes(range=[y_min-y_range/10, y_max+x_range/10])
    fig.update_layout(
    title_text=title,
    xaxis_title=x,
    yaxis_title=y,
    showlegend=False,
    )

    fig.show()
    #plotly.offline.plot(fig, filename='graph.html')

Entschuldigen Sie, dass ich so lange bin ... Es gibt zwei Punkte.

Punkt 1

fig.add_trace(
    go.Scatter(
        x = df[df[hue]==clu][x],
        y = df[df[hue]==clu][y],
        mode="markers",
        name=clu,
        marker=dict(color=colors[i])
        )
    )

In diesem Teil erstellen wir ein Streudiagramm jedes Clusters im Datenrahmen `df```.` Farben`` enthält die von plt automatisch ausgewählte Farbzeichenfolge. Daher wird es in der Reihenfolge mit `color = colours [i]` angegeben.

Punkt 2

tf = [False]*n_cluster
tf[i] = True
tmp = dict(label=clu,
           method="update",
           args=[{"visible": tf}]
           )
button.append(tmp)

zu tf[False, True, False, False, False]Es gibt einen booleschen Wert wie,Wählen Sie aus, welche Spur angezeigt / ausgeblendet werden soll.


 Dieses Mal überlappen sich in `` `fig.add_trace``` 5 Streudiagramme und welche Zahl angezeigt werden soll.` `` Tf = [True, True, True, True, True " ] `` `und all True zeigen ein Streudiagramm aller Daten an.


 Danach in der nächsten Zeile

```python
plotly_scatterplot(x="x", y="y", hue="class", data=df, title="Scatter Plot")

Sie können den Plot am Anfang zeichnen.

das ist alles!

Referenz

Plotly:Update Button stack overflow:Get default line colour cycle

Recommended Posts

[Python] Wenn Sie ein Streudiagramm mehrerer Cluster zeichnen möchten
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
Wenn Sie einer Variablen in Python einen CSV-Export zuweisen möchten
Wenn Sie einen Singleton in Python möchten, stellen Sie sich das Modul als Singleton vor
Wenn Sie Word Cloud erstellen möchten.
Wenn Sie eine TODO-Anwendung (verteilt) jetzt nur mit Python erstellen möchten
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
[Python] Wenn Sie plötzlich ein Anfrageformular erstellen möchten
Wenn Sie einen UNIX-Befehl in Python ausführen möchten
Wenn Sie Datenwissenschaftler werden möchten, beginnen Sie mit Kaggle
Schreiben Sie Python nicht, wenn Sie es mit Python beschleunigen möchten
Ich möchte wissen, ob Sie Python auf Mac ・ Iroha installieren
Überprüfen Sie, ob Sie in Python eine Verbindung zu einem TCP-Port herstellen können
Wenn Sie eine mehrdimensionale Liste nach mehreren Zeilen sortieren möchten
Wenn Sie mehrere Versionen derselben Python-Bibliothek verwenden möchten (virtuelle Umgebung mit venv)
Wenn Sie mehrere Zeichen in einer Zeichenfolge ersetzen möchten, ohne reguläre Ausdrücke in der Python3-Serie zu verwenden
Wenn Sie awsebcli in CircleCI aufnehmen möchten, geben Sie die Python-Version an
Python Hinweis: Wenn Sie die Attribute eines Objekts kennen möchten
Wenn Sie mehrere Statistiken mit groupby of pandas v1 erhalten möchten
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Wenn Sie Wörter in Python zählen möchten, können Sie bequem Counter verwenden.
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Wenn Sie den Ausführungsbenutzer mitten in einer Fabric-Aufgabe wechseln möchten, stellen Sie den Kontextmanager ein
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Zwei Tools zur Dokumentenerstellung, die Sie unbedingt verwenden möchten, wenn Sie Python schreiben
Wenn Sie den Wert mithilfe von Auswahlmöglichkeiten in der Vorlage im Django-Modell anzeigen möchten
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
[Python] Zeichnen mehrerer Diagramme mit Matplotlib
Wenn Sie eine Windows-App (exe) erstellen möchten, die jetzt nur mit Python verwendet werden kann
Was Sie sich mit der grundlegenden Grammatik "String Manipulation" von Python merken möchten
Machen Sie mit Python eine Joyplot-ähnliche Handlung von R.
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Zeichnen Sie ein Faltlinien- / Streudiagramm mit Python Matplotlib für die CSV-Datei (2 Spalten).
Ich möchte mit Python in eine Datei schreiben
[Linux] Wenn Sie aus mehreren Dateien nach einer bestimmten Zeichenfolge suchen möchten
So überprüfen Sie in Python, ob sich eines der Elemente einer Liste in einer anderen Liste befindet
Python-Ertrag verstehen Wenn Sie Ertrag in eine Funktion einfügen, wird dieser in einen Generator geändert
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte einen Python-Generator viele Male iterieren
Memo mit Python mit HiveServer2 von EMR verbunden
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Wenn Sie Cython verwenden möchten, schließen Sie auch python-dev ein
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
Wenn in Python ein "Unicode-Dekodierungsfehler" auftritt
Ich möchte ein Paket von Php Redis installieren
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Python + Selen zu GW viele Mail-Anzeigen
Wenn Sie in der for-Anweisung plt.save möchten
Ich möchte einen Quantencomputer mit Python betreiben
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Überprüfen Sie beim Lösen der einführenden Statistikübung 12.10, wie Sie ein Streudiagramm in Pandas zeichnen.
Python-Skript, das den Status des Servers über den Browser überprüfen kann