Lorsque vous dessinez un diagramme de dispersion de plusieurs clusters, les points peuvent se chevaucher et cela peut être difficile à voir. Par conséquent, j'ai créé un graphique qui peut être confirmé un cluster à la fois en utilisant `` Plotly ''.
Par exemple, lorsqu'il existe de telles données avec des coordonnées xy divisées en 5 groupes,
Par exemple, avec `` Seaborn '', vous pouvez dessiner le tracé suivant sur une seule ligne.
sns.scatterplot(x="x", y="y", hue="class", data=df)
Cependant, il est un peu difficile de voir s'il reste au-dessus, alors spécifiez la transparence alpha
,
sns.scatterplot(x="x", y="y", hue="class", data=df, alpha=0.5)
Bien que cela se soit un peu amélioré, il est encore difficile de voir avec ces données.
J'ai donc pensé que ce serait bien si je pouvais tracer les clusters un par un ... et j'ai essayé d'utiliser `` Plotly ''.
Tout d'abord, préparez la bibliothèque,
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
Préparez des données factices.
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
Ensuite, la partie intrigue du sujet principal, Je vais d'abord vous montrer tout le 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')
Excusez-moi d'être si long ... Il y a deux points.
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])
)
)
Dans cette partie, nous créons un diagramme de dispersion pour chaque cluster dans le bloc de données
df``` . `` colors
contient la chaîne de couleurs automatiquement sélectionnée par plt. Par conséquent, il est spécifié dans l'ordre avec
color = colors [i] ''
.
tf = [False]*n_cluster
tf[i] = True
tmp = dict(label=clu,
method="update",
args=[{"visible": tf}]
)
button.append(tmp)
à tf[False, True, False, False, False]Il existe une valeur booléenne comme,Sélectionnez la trace à afficher / masquer.
Cette fois, avec `` `fig.add_trace```, 5 diagrammes de dispersion sont superposés, et quel nombre doit être affiché.` `` Tf = [True, True, True, True, True " ] ```And all True affichera un diagramme de dispersion de toutes les données.
Après cela, dans la ligne suivante,
```python
plotly_scatterplot(x="x", y="y", hue="class", data=df, title="Scatter Plot")
Vous pouvez dessiner le tracé au début.
c'est tout!
Plotly:Update Button stack overflow:Get default line colour cycle