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.
Wenn zum Beispiel solche Daten mit xy-Koordinaten vorhanden sind, die in 5 Cluster unterteilt sind,
Mit `` `seaborn``` können Sie beispielsweise das folgende Diagramm in einer Linie zeichnen.
sns.scatterplot(x="x", y="y", hue="class", data=df)
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)
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.
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.
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.
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!
Plotly:Update Button stack overflow:Get default line colour cycle