[Python] Si vous souhaitez dessiner un diagramme de dispersion de plusieurs clusters

Objectif de cet article

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 ''.

plot.gif

Contexte

Par exemple, lorsqu'il existe de telles données avec des coordonnées xy divisées en 5 groupes,

image02.png

Par exemple, avec `` Seaborn '', vous pouvez dessiner le tracé suivant sur une seule ligne.

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

image01.png

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)

image02.png

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 ''.

Commentaire

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.

Point 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])
        )
    )

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] ''.

Point 2

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!

référence

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

Recommended Posts

[Python] Si vous souhaitez dessiner un diagramme de dispersion de plusieurs clusters
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Si vous souhaitez affecter une exportation csv à une variable en python
Si vous voulez un singleton en python, considérez le module comme un singleton
Si vous souhaitez créer Word Cloud.
Si vous souhaitez créer une application TODO (distribuée) maintenant en utilisant uniquement Python
Si vous voulez créer un bot discord avec python, utilisons un framework
[Python] Si vous souhaitez soudainement créer un formulaire de demande
Lorsque vous souhaitez lancer une commande UNIX sur Python
Si vous souhaitez devenir data scientist, commencez par Kaggle
N'écrivez pas Python si vous voulez l'accélérer avec Python
Je veux savoir si vous installez Python sur Mac ・ Iroha
Vérifiez si vous pouvez vous connecter à un port TCP en Python
Lorsque vous souhaitez trier une liste multidimensionnelle sur plusieurs lignes
Lorsque vous souhaitez utiliser plusieurs versions de la même bibliothèque Python (environnement virtuel utilisant venv)
Lorsque vous souhaitez remplacer plusieurs caractères dans une chaîne de caractères sans utiliser d'expressions régulières dans la série python3
Si vous souhaitez inclure awsebcli dans CircleCI, spécifiez la version de python
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
Si vous souhaitez obtenir plusieurs statistiques avec groupby of pandas v1
Je veux colorer une partie de la chaîne Excel avec Python
Si vous souhaitez compter les mots en Python, il est pratique d'utiliser Counter.
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Si vous souhaitez changer d'utilisateur d'exécution au milieu d'une tâche Fabric, le gestionnaire de contexte des paramètres
Dessiner un graphique d'une fonction quadratique en Python
Deux outils de génération de documents que vous souhaitez absolument utiliser si vous écrivez python
Si vous souhaitez afficher la valeur à l'aide des choix du modèle dans le modèle Django
Essayez de dessiner une courbe de vie avec python
[Python] Comment dessiner plusieurs graphiques avec Matplotlib
Si vous souhaitez créer une application Windows (exe) qui peut être utilisée maintenant en utilisant uniquement Python
Ce que vous voulez mémoriser avec la grammaire de base de "manipulation de chaînes" de python
Créez un tracé de R semblable à un joyplot avec python
[Python] Comment dessiner un histogramme avec Matplotlib
Dessinez une ligne de pliage / diagramme de dispersion avec python matplotlib pour fichier CSV (2 colonnes)
Je veux écrire dans un fichier avec Python
[Linux] Lorsque vous souhaitez rechercher une chaîne de caractères spécifique dans plusieurs fichiers
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
Comprendre le rendement Python Si vous mettez le rendement dans une fonction, elle se transforme en générateur
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux répéter plusieurs fois un générateur Python
Mémo connecté à HiveServer2 d'EMR avec python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux écrire en Python! (2) Écrivons un test
Si vous souhaitez utiliser Cython, incluez également python-dev
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
Si vous rencontrez une "erreur de décodage Unicode" en Python
Je souhaite installer un package de Php Redis
[Python] Je veux faire d'une liste imbriquée un taple
Python + sélénium pour GW beaucoup de publicités par courrier électronique
Lorsque vous voulez plt.save dans l'instruction for
Je veux faire fonctionner un ordinateur quantique avec Python
Note Python: Le mystère de l'attribution d'une variable à une variable
Notez ce que vous voulez faire à l'avenir avec Razpai
Lors de la résolution de l'exercice d'introduction aux statistiques 12.10, vérifiez comment dessiner un diagramme de dispersion dans les pandas.
Script Python qui peut vérifier l'état du serveur à partir du navigateur