[PYTHON] Créez un graphique à l'aide du bouton et du curseur de l'intrigue

Chose que tu veux faire

--Créez un bouton dans le graphique et appuyez sur le bouton pour utiliser la mise en page comme afficher / masquer le tracé et le titre.

button_slider_plotly.gif

environnement

pip

python


pip install plotly
pip install numpy

Examen du bouton

button_plotly.gif

python


import numpy as np
import plotly.offline as offline
import plotly.graph_objs as go
import plotly

#Obtenir la couleur de la ligne
colors = plotly.colors.DEFAULT_PLOTLY_COLORS

x = np.linspace(-5, 5, 11)
data = []
for i in range(1, 4):
    trace = go.Scatter(
        x=x,
        y=x ** i,
        name="y{}".format(i),
        mode="lines",
        line=dict(color=colors[i], width=6),
        visible=False,
        showlegend=True
    )

    data.append(trace)
#Rendre le 0ème des données visible comme état initial
data[0].visible = True

"""
Emplacement de création du bouton
Description clé
active:Spécifiez le bouton enfoncé dans l'état initial, entrez l'index de la liste des boutons
type:Liste déroulante ou bouton( "dropdown" | "buttons" ), default="dropdown"
buttons:Paramètres des boutons
"""
buttons = []
for ii in range(len(data)):
    visible = [False] * len(data)  # len(data)=Parce que 3, visible=[False, False, False]
    visible[ii] = True  #Définir uniquement le iith sur True, ex) [True, False, False]
    button = dict(label=data[ii].name,
                  method="update",  #Pour mettre à jour la mise en page"update"
                  args=[dict(visible=visible),  #Seule la trace de la pièce définie sur True peut être vue
                        dict(title="button_plotly_{}".format(data[ii].name),  #mise à jour du titre
                             yaxis=dict(title="yaxis_{}".format(data[ii].name), showspikes=True))])  #mise à jour de l'étiquette de l'axe y
    buttons.append(button)

updatemenus = [dict(active=0, type="buttons", buttons=buttons)]

layout = go.Layout(
    title="button_plotly_y1",
    xaxis=dict(title="xaxis", showspikes=True, domain=[0.05, 1.0]),
    yaxis=dict(title="yaxis_y1", showspikes=True),
    font=dict(size=16),
    updatemenus=updatemenus,
    showlegend=True)

fig = dict(data=data, layout=layout)
offline.plot(fig, auto_open=True, include_plotlyjs="cdn", filename=r"./button_plotly.html")

Vous trouverez ci-dessous l'emplacement de création du bouton. updatemenus = [dict (active = 0, type =" boutons "," boutons "= boutons)] "boutons" = boutons` crée des informations (afficher / masquer, etc.) lorsque le bouton est enfoncé C'est là que vous êtes.

boutons est une liste qui contient un dictionnaire d'informations de mise en page (variables bouton ci-dessous).

python


"""
Emplacement de création du bouton
Description clé
active:Spécifiez le bouton enfoncé dans l'état initial, entrez l'index de la liste des boutons
type:Liste déroulante ou bouton( "dropdown" | "buttons" ), default="dropdown"
buttons:Paramètres des boutons
"""
buttons = []
for ii in range(len(data)):
    visible = [False] * len(data)  # len(data)=Parce que 3, visible=[False, False, False]
    visible[ii] = True  #Définir uniquement le iith sur True, ex) [True, False, False]
    button = dict(label=data[ii].name,
                  method="update",  #Pour mettre à jour la mise en page"update"
                  args=[dict(visible=visible),  #Seule la trace de la pièce définie sur True peut être vue
                        dict(title="button_plotly_{}".format(data[ii].name),  #mise à jour du titre
                             yaxis=dict(title="yaxis_{}".format(data[ii].name), showspikes=True))])  #mise à jour de l'étiquette de l'axe y
    buttons.append(button)

updatemenus = [dict(active=0, type="buttons", buttons=buttons)]


Cette fois, j'ai écrit pour afficher / masquer le tracé et changer le titre et l'étiquette de l'axe y avec le bouton.

python


visible=[False] * len(data)
visble[ii] = True

Définit le tracé à afficher.

Par exemple, lorsque data = [trace1, trace2, trace3] et visible = [True, False, False], seule trace1 est affichée.

Enfin, vous pouvez créer un bouton sur le graphique avec go.Layout (updatemenus = updatemenus).

Détails Création d'un graphique avec plotly button-Qiita

Revue du curseur

slider_plotly.gif

python


import numpy as np
import plotly.offline as offline
import plotly.graph_objs as go

# sin,Enregistrer les traces d'onde cos séparément
sin_data, cos_data = [], []
x = np.linspace(0, 10, 101)

for step in np.linspace(0, 5, 51):
    y = np.sin(step * x)
    y2 = np.cos(step * x)

    sin_trace = go.Scatter(
        x=x,
        y=y,
        name="sin {:.1f}Hz".format(step),
        line=dict(color="red", width=3),
        visible=False, )

    cos_trace = go.Scatter(
        x=x,
        y=y2,
        name="cos {:.1f}Hz".format(step),
        line=dict(color="blue", width=3),
        visible=False, )

    sin_data.append(sin_trace)
    cos_data.append(cos_trace)

# sin,Les deux cos sont indexés par défaut=Afficher 10 traces
sin_data[10].visible = True
cos_data[10].visible = True

data = sin_data + cos_data

steps = []
"""
sin_data, cos_Affichage des données/Définir caché séparément, puis combiner et ajouter à la clé visible
Par exemple, lorsque le curseur est 2,
sin_visible = [False, False, True, False,...]
cos_visible = [False, False, True, False,...]
En combinant les deux après,cos les deux index=Autoriser l'affichage de 2 traces
"""
for s in range(len(sin_data)):
    # sin_data, cos_Masquer toutes les données une fois
    sin_visible, cos_visible = [False] * len(sin_data), [False] * len(cos_data)
    #Rendre seulement le qc visible
    sin_visible[s], cos_visible[s] = True, True
    step = dict(method="update",
                args=[{"visible": sin_visible + cos_visible},
                      {"title": "Simple slider step: {}".format(s)}]
                )
    steps.append(step)

sliders = [dict(active=10, currentvalue=dict(prefix="Frequency: "), pad=dict(t=50), steps=steps)]

layout = go.Layout(
    title="Simple slider step: 10",
    xaxis=dict(title="x"),
    yaxis=dict(title="y"),
    font=dict(size=16),
    hovermode='x unified',
    hoverlabel=dict(font_size=16),
    sliders=sliders,
    showlegend=True)

fig = dict(data=data, layout=layout)

offline.plot(fig, include_plotlyjs="cdn", filename="plots.html")

Je crée un curseur ci-dessous

python


steps = []
"""
sin_data, cos_Affichage des données/Définir caché séparément, puis combiner et ajouter à la clé visible
Par exemple, lorsque le curseur est 2,
sin_visible = [False, False, True, False,...]
cos_visible = [False, False, True, False,...]
En combinant les deux après,cos les deux index=Autoriser l'affichage de 2 traces
"""
for s in range(len(sin_data)):
    # sin_data, cos_Masquer toutes les données une fois
    sin_visible, cos_visible = [False] * len(sin_data), [False] * len(cos_data)
    #Rendre seulement le qc visible
    sin_visible[s], cos_visible[s] = True, True
    step = dict(method="update",
                args=[{"visible": sin_visible + cos_visible},
                      {"title": "Simple slider step: {}".format(s)}]
                )
    steps.append(step)

sliders = [dict(active=10, currentvalue=dict(prefix="Frequency: "), pad=dict(t=50), steps=steps)]

Ce que vous faites n'est pas très différent d'un bouton. sliders = [dict (active = 10, currentvalue = dict (prefix =" Frequency: "), pad = dict (t = 50), steps = steps)] quand steps = steps déplace le curseur C'est là que les informations (afficher / masquer, etc.) sont créées.

steps est une liste, qui contient un dictionnaire d'informations de mise en page (variables step ci-dessus).

Enfin, go.Layout (sliders = sliders) crée un curseur sur le graphique.

Détails Application du graphique à l'aide du curseur de tracé --Qiita

Exemple de graphique

button_slider_plotly.gif

Avec 3 boutons

Après avoir changé l'affichage de, modifiez la fréquence avec le curseur du tracé visible.

Créez trois curseurs, ALL, SIN et COS, et remplacez les curseurs lors de la mise à jour de la mise en page avec le bouton.

python


import copy
import numpy as np
import plotly.offline as offline
import plotly.graph_objs as go

# sin,Enregistrer les traces d'onde cos séparément
sin_data, cos_data = [], []
x = np.linspace(0, 10, 101)

for step in np.linspace(0, 5, 51):
    y = np.sin(step * x)
    y2 = np.cos(step * x)

    sin_trace = go.Scatter(
        x=x,
        y=y,
        name="sin {:.1f}Hz".format(step),
        line=dict(color="red", width=3),
        visible=False, )

    cos_trace = go.Scatter(
        x=x,
        y=y2,
        name="cos {:.1f}Hz".format(step),
        line=dict(color="blue", width=3),
        visible=False, )

    sin_data.append(sin_trace)
    cos_data.append(cos_trace)

sin_data[10].visible = True
cos_data[10].visible = True

data = sin_data + cos_data

steps = {"ALL": [], "SIN": [], "COS": []}
"""
Il y a un total de 4 listes d'informations visibles
sin_visible_false:Toutes les ondes de péché visibles sont fausses
cos_visible_false:Toutes les ondes cos visibles sont fausses
sin_visible_true:indice d'onde de péché=visible de s est vrai
cos_visible_true:indice d'onde cos=visible de s est vrai

Si vous ne souhaitez pas l'afficher, vous pouvez le définir sur False.
sin,informations visibles lors de l'affichage des deux cos: sin_visible_true + cos_visible_true
Informations visibles lors de l'affichage uniquement du péché: sin_visible_true + cos_visible_false
Informations visibles lors de l'affichage uniquement de cos: sin_visible_false + cos_visible_true
"""
for s in range(len(sin_data)):
    # sin_data, cos_Masquer toutes les données une fois
    sin_visible_false, cos_visible_false = [False] * len(sin_data), [False] * len(cos_data)
    # sin_visible_false, cos_visible_Création de fausses copies, copie d'index=Vrai pour s
    sin_visible_true, cos_visible_true = copy.copy(sin_visible_false), copy.copy(cos_visible_false)
    sin_visible_true[s], cos_visible_true[s] = True, True

    step_all = dict(method="update",
                    args=[{"visible": sin_visible_true + cos_visible_true},
                          {"title": "slider_button_ALL step: {}".format(s)}]
                    )
    step_sin = dict(method="update",
                    args=[{"visible": sin_visible_true + cos_visible_false},
                          {"title": "slider_button_SIN step: {}".format(s)}]
                    )
    
    step_cos = dict(method="update",
                    args=[{"visible": sin_visible_false + cos_visible_true},
                          {"title": "slider_button_COS step: {}".format(s)}]
                    )

    steps["ALL"].append(step_all)
    steps["SIN"].append(step_sin)
    steps["COS"].append(step_cos)

sliders = {}
for key, step in steps.items():
    slider = [dict(active=10, currentvalue=dict(prefix="Frequency: "), pad=dict(t=50), steps=step)]
    sliders[key] = slider

buttons = []
for key, slider in sliders.items():
    slider_active = slider[0]["active"]
    slider_visible = slider[0]["steps"][slider_active]["args"][0]["visible"]
    button = dict(label=key,
                  method="update",
                  args=[dict(visible=slider_visible),
                        dict(title="slider_button_{} step: {}".format(key, slider_active),
                             yaxis=dict(title="y {}".format(key)),
                             sliders=slider)])
    buttons.append(button)

updatemenus = [dict(active=0, type="buttons", buttons=buttons)]

layout = go.Layout(
    title="slider_button_ALL step: 10",
    xaxis=dict(title="x", domain=[0.05, 1]),
    yaxis=dict(title="y ALL"),
    font=dict(size=16),
    hovermode='x unified',
    hoverlabel=dict(font_size=16),
    sliders=sliders["ALL"],
    updatemenus=updatemenus,
    showlegend=True)

fig = dict(data=data, layout=layout)

offline.plot(fig, auto_open=True, include_plotlyjs="cdn", filename=r"./slider_button_plotly.html",
             config={'modeBarButtonsToAdd': ['drawline', 'drawopenpath', 'drawclosedpath', 'drawcircle', 'drawrect',
                                             'eraseshape']})

Je crée un affichage de tracé lorsque le curseur est déplacé.

python


steps = {"ALL": [], "SIN": [], "COS": []}
"""
Il y a un total de 4 listes d'informations visibles
sin_visible_false:Toutes les ondes de péché visibles sont fausses
cos_visible_false:Toutes les ondes cos visibles sont fausses
sin_visible_true:indice d'onde de péché=visible de s est vrai
cos_visible_true:indice d'onde cos=visible de s est vrai

Si vous ne souhaitez pas l'afficher, vous pouvez le définir sur False.
sin,informations visibles lors de l'affichage des deux cos: sin_visible_true + cos_visible_true
Informations visibles lors de l'affichage uniquement du péché: sin_visible_true + cos_visible_false
Informations visibles lors de l'affichage uniquement de cos: sin_visible_false + cos_visible_true
"""
for s in range(len(sin_data)):
    # sin_data, cos_Masquer toutes les données une fois
    sin_visible_false, cos_visible_false = [False] * len(sin_data), [False] * len(cos_data)
    # sin_visible_false, cos_visible_Création de fausses copies, copie d'index=Vrai pour s
    sin_visible_true, cos_visible_true = copy.copy(sin_visible_false), copy.copy(cos_visible_false)
    sin_visible_true[s], cos_visible_true[s] = True, True

    step_all = dict(method="update",
                    args=[{"visible": sin_visible_true + cos_visible_true},
                          {"title": "slider_button_ALL step: {}".format(s)}]
                    )
    step_sin = dict(method="update",
                    args=[{"visible": sin_visible_true + cos_visible_false},
                          {"title": "slider_button_SIN step: {}".format(s)}]
                    )

    step_cos = dict(method="update",
                    args=[{"visible": sin_visible_false + cos_visible_true},
                          {"title": "slider_button_COS step: {}".format(s)}]
                    )

    steps["ALL"].append(step_all)
    steps["SIN"].append(step_sin)
    steps["COS"].append(step_cos)

sliders = {}
for key, step in steps.items():
    slider = [dict(active=10, currentvalue=dict(prefix="Frequency: "), pad=dict(t=50), steps=step)]
    sliders[key] = slider

Le contenu des curseurs est {" ALL ": slider quand ALL," SIN ": slider quand SIN, ...}

python


buttons = []
for key, slider in sliders.items():
    slider_active = slider[0]["active"]
    slider_visible = slider[0]["steps"][slider_active]["args"][0]["visible"]
    button = dict(label=key,
                  method="update",
                  args=[dict(visible=slider_visible),
                        dict(title="slider_button_{} step: {}".format(key, slider_active),
                             yaxis=dict(title="y {}".format(key)),
                             sliders=slider)])
    buttons.append(button)

updatemenus = [dict(active=0, type="buttons", buttons=buttons)]

Je crée un bouton. slider_visible = slider [0] [" steps "] [slider_active] [" args "] [0] [" visible "] obtient les informations visibles de la position initiale du curseur.

Dans le cas du script ci-dessus, la position initiale du curseur est définie sur 10, de sorte que la position du curseur et l'affichage ne correspondent pas à moins que l'affichage immédiatement après la commutation du bouton ne corresponde également à celui-ci.

python


layout = go.Layout(
    title="slider_button_ALL step: 10",
    xaxis=dict(title="x", domain=[0.05, 1]),
    yaxis=dict(title="y ALL"),
    font=dict(size=16),
    hovermode='x unified',
    hoverlabel=dict(font_size=16),
    sliders=sliders["ALL"],
    updatemenus=updatemenus,
    showlegend=True)

fig = dict(data=data, layout=layout)

offline.plot(fig, auto_open=True, include_plotlyjs="cdn", filename=r"./slider_button_plotly.html",
             config={'modeBarButtonsToAdd': ['drawline', 'drawopenpath', 'drawclosedpath', 'drawcircle', 'drawrect',
                                             'eraseshape']})

La mise en page est décidée et sortie. La valeur par défaut est d'afficher TOUS.

config = {...} ajoute un bouton de dessin en haut à droite.

référence

officiel Custom Buttons | Python | Plotly layout.updatemenus | Python | Plotly Plotly Python Graphing Library | Python | Plotly

Recommended Posts

Créez un graphique à l'aide du bouton et du curseur de l'intrigue
Créer un graphique à l'aide du module Sympy
tracé Créer un graphique avec un bouton
Une note lors de la création d'un graphe dirigé à l'aide de Graphviz en Python
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
Créer une application Web avec Flask ②
Créer un tableau simple à l'aide de prettytable
Créer une application Web avec Flask ①
Créer un modèle d'apprentissage à l'aide de MNIST
Créer une application Web avec Flask ③
Faire un joli graphique avec plotly
Créer une application Web avec Flask ④
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Créer une lecture de feuille de notes avec Python OpenCV (Conseils pour bien lire)
Comment dessiner un graphique avec Matplotlib
Derrière l'algorithme de dessin graphique et Networkx
Création d'une application d'analyse de données à l'aide de Streamlit
Ajouter une couche à l'aide du backend Keras
J'ai eu la date du riz du pub de Kagawa et j'ai dessiné un graphique
Créez une API REST à l'aide du modèle appris dans Lobe et TensorFlow Serving.
Utilisez libsixel pour générer Sixel en Python et générer le graphe Matplotlib vers le terminal.
[Python] Un programme qui trouve les valeurs minimales et maximales sans utiliser de méthodes
Création d'un modèle d'estimation de position pour la compétition d'intelligence humaine de loup à l'aide de l'apprentissage automatique
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Résoudre les problèmes de sac à dos à l'aide de pyomo et glpk
Mémo qui a fait un graphique pour animer avec intrigue
ffmpeg-Construisez un environnement python et divisez la vidéo
Ecrire un serveur TCP à l'aide du module SocketServer
Création d'une application interactive à l'aide d'un modèle de rubrique
Créer une carte Web en utilisant Python et GDAL
Vérification des méthodes et des variables à l'aide de la bibliothèque voir
Répondre à l'image redimensionnée à l'aide de Flask et PILImage
Générez des valeurs de hachage à l'aide de la méthode HMAC.
"Création d'un ensemble de données sur le cours de l'action" et "Mise en œuvre de l'AR (1)"
[Bash] Création d'un répertoire temporaire sûr et polyvalent
Prise en compte des forces et faiblesses de Python
Créez une interface graphique sur le terminal à l'aide de curses
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"