[PYTHON] Créez une application Web qui peut être facilement visualisée avec Plotly Dash

Qu'est-ce que Plotly Dash?

Plotly Dash (Le nom officiel semble être Dash, mais comme il existe diverses autres applications nommées Dash, j'utiliserai cette notation) est un cadre d'une application Web créée par Python. C'est un travail. Il existe de nombreux frameworks Web Python tels que Flask et Bottle, mais Plotly Dash peut incorporer des données visualisées en utilisant Plotly.

Installation

Installez avec pip. Je n'ai pas confirmé s'il peut être installé avec conda.

pip install dash==0.17.7  # The core dash backend
pip install dash-renderer==0.7.4  # The dash front-end
pip install dash-html-components==0.7.0  # HTML components
pip install dash-core-components==0.11.0  # Supercharged components
pip install plotly==2.0.12  # Plotly graphing library used in examples

J'essaierai d'écrire pour le moment

import dash
import dash_core_components as dcc
import dash_html_components as html
import numpy as np

x = np.linspace(-np.pi, np.pi, 10)
y = np.sin(x)
app = dash.Dash()

app.layout = html.Div(children=[
    html.H1(children='Texte H1'),

    html.Div(children='''
texte div
    '''),

    dcc.Graph(
        id='example-graph',
        figure={
            'data': [
                {'x': x, 'y': np.sin(x), 'type': 'line', 'name': 'line'},
                {'x': x, 'y': np.cos(x), 'type': 'bar', 'name': 'bar'},
            ],
            'layout': {
                'title': 'Titre du graphique'
            }
        }
    )
])

if __name__ == '__main__':
    app.run_server(debug=True)

Screenshot at 2017-08-05 13-45-20.png

Vous n'êtes pas obligé d'écrire du HTML comme ci-dessus, juste du code Python. Plotly est en charge de dessiner le graphique.

Markdown Il prend en charge la notation Markdown.

import dash
import dash_html_components as html
import dash_core_components as dcc

markdown_doc = dcc.Markdown('''
#Titre 1
##Titre 2
###Titre 3
---
*Balle
*Balle
---

[Rinku](http://commonmark.org/help)
![Image](https://images.plot.ly/static/marketing/dash/dash-logo.png)

>Citation
''')

app = dash.Dash()
app.layout = html.Div(markdown_doc)

if __name__ == '__main__':
    app.run_server(debug=True)

image.png

Je ne pouvais pas exprimer la table dans mon environnement. Veuillez me faire savoir si quelqu'un a réussi.

Live Updates Il prend également en charge les graphiques dynamiques.

L'exemple ci-dessous utilise psutil pour surveiller l'état des ressources d'une machine en temps réel.

import dash
from dash.dependencies import Input, Output, Event
import dash_core_components as dcc
import dash_html_components as html
import datetime
import plotly
import numpy as np
import pandas as pd
import psutil

colors = {
    'background': '#111111',
    'text': '#7FDBFF'
}

app = dash.Dash(__name__)
app.layout = html.Div(children=[
    html.Div([
        html.H4('Moniteur système Oreore'),
        html.Div(id='live-update-text'),
        dcc.Graph(id='live-update-graph'),
        html.H4('Liste des processus'),
        html.Div(id='live-update-proc'),
        dcc.Interval(
            id='interval-component',
            interval=1 * 1000  # in milliseconds
        )
    ])
],
    style={'backgroundColor': colors['background'], 'color': colors['text']}
)


class Context:
    def __init__(self):
        self.t = []
        self.cpu = []
        self.per_cpu = [[] for x in range(psutil.cpu_count())]
        self.mem = []

    @classmethod
    def append_data(cls, d1, d2):
        n = len(d1)
        if n > 100:
            del d1[0:n - 99]
        d1.append(d2)


context = Context()

# The `dcc.Interval` component emits an event called "interval"
# every `interval` number of milliseconds.
# Subscribe to this event with the `events` argument of `app.callback`


@app.callback(Output('live-update-text', 'children'),
              events=[Event('interval-component', 'interval')])
def update_metrics():
    now = datetime.datetime.now()
    hour, minute, second = now.hour, now.minute, now.second
    style = {'padding': '5px', 'fontSize': '16px'}
    return [
        html.Span('CPU: {}%'.format(context.cpu[-1]), style=style),
        html.Span('Memory: {}%'.format(context.mem[-1]), style=style)
    ]


# Multiple components can update everytime interval gets fired.
@app.callback(Output('live-update-graph', 'figure'),
              events=[Event('interval-component', 'interval')])
def update_graph_live():
    # global context
    context.append_data(context.t, datetime.datetime.now())
    context.append_data(context.cpu, psutil.cpu_percent())
    for data, pct in zip(context.per_cpu, psutil.cpu_percent(percpu=True)):
        context.append_data(data, pct)
    context.append_data(context.mem, psutil.virtual_memory().percent)

    # Create the graph with subplots
    fig = plotly.tools.make_subplots(rows=2, cols=1, vertical_spacing=0.2)
    fig['layout']['margin'] = {
        'l': 30, 'r': 10, 'b': 30, 't': 10
    }
    fig['layout']['plot_bgcolor'] = colors['background']
    fig['layout']['paper_bgcolor'] = colors['background']
    fig['layout']['font'] = {'color': colors['text']}
    fig['layout']['legend'] = {'x': 0, 'y': 1, 'xanchor': 'left'}
    fig['layout']['yaxis1'].update(range=[0, 100])
    fig['layout']['yaxis2'].update(range=[0, 100])

    fig.append_trace({
        'x': context.t,
        'y': context.cpu,
        'name': 'cpu',
        'mode': 'lines',
        'type': 'scatter',
    }, 1, 1)
    for i, y in enumerate(context.per_cpu):
        fig.append_trace({
            'x': context.t,
            'y': y,
            'name': 'cpu {}'.format(i),
            'mode': 'lines',
            'type': 'scatter',
        }, 1, 1)
    fig.append_trace({
        'x': context.t,
        'y': context.mem,
        'name': 'memory',
        'mode': 'lines',
        'type': 'scatter',
        'fill': 'tonexty',
    }, 2, 1)

    return fig


def get_proc_df():
    def get_proc(proc):
        try:
            pinfo = proc
        except psutil.NoSuchProcess:
            pass
        return (pinfo.pid, pinfo.name(), pinfo.memory_percent(), pinfo.cpu_percent())

    data = [get_proc(proc) for proc in psutil.process_iter()]
    df = pd.DataFrame(data, columns=['pid', 'name', 'memory', 'cpu'])
    df['memory'] = df['memory'].map(lambda x: '{:.2f}%'.format(x))
    df['cpu'] = df['cpu'] / psutil.cpu_count()
    df['cpu'] = df['cpu'].map(lambda x: '{:.2f}%'.format(x))
    return df.sort_values('cpu', ascending=False)


@app.callback(Output('live-update-proc', 'children'),
              events=[Event('interval-component', 'interval')])
def generate_table():
    df = get_proc_df()
    max_rows = 10
    return html.Table(
        # Header
        [html.Tr([html.Th(col) for col in df.columns])] +

        # Body
        [html.Tr([
            html.Td(df.iloc[i][col], style={'width': '8em'}) for col in df.columns
        ]) for i in range(min(len(df), max_rows))]
    )


if __name__ == '__main__':
    app.run_server(debug=True)

Peek 2017-08-05 16-52.gif

Fonctionnement interactif

Vous pouvez contrôler le contenu de sortie de manière interactive tout en utilisant l'interface utilisateur. J'écrirai bientôt comment le faire.

Recommended Posts

Créez une application Web qui peut être facilement visualisée avec Plotly Dash
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez une API Web capable de fournir des images avec Django
Créez une application Web simple avec Flask
[Python] Créez un graphique qui peut être déplacé avec Plotly
Créez un graphique des devises qui peut être déplacé avec Plotly (2)
Créez un graphique des devises qui peut être déplacé avec Plotly (1)
Vous pouvez facilement créer une interface graphique même avec Python
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Faisons un diagramme sur lequel on peut cliquer avec IPython
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Page de création de décalage)
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
[Python] Dessinez des données d'altitude sur une surface sphérique avec Plotly et dessinez un globe qui peut être tourné en rond et en rond
Jouez comme une application Web avec ipywidgets
Créer une application graphique avec Tkinter de Python
Démonisez une application Web Python avec Supervisor
Créer un service Web avec Docker + Flask
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
Le panneau Web LXC qui peut faire fonctionner LXC avec un navigateur était merveilleux
Comment créer un bot Janken qui peut être facilement déplacé (commentaire)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Introduction)
[Peut être fait en 10 minutes] Créez rapidement un site Web local avec Django
Je voulais créer rapidement un serveur de messagerie utilisable librement avec postfix + dovecot sur EC2
Notes pour créer des figures pouvant être publiées dans des revues avec matplotlib
Une application Web qui ne fait que Hello World avec le package net / http de Go
Types de fichiers pouvant être utilisés avec Go
Créez une application qui devine les étudiants avec Python
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Créer une page qui se charge indéfiniment avec python
[kotlin] Créez une application qui reconnaît les photos prises avec un appareil photo sur Android
Formatez les données DataFrame avec Pytorch sous une forme pouvant être entraînée avec NN
Répertorier les packages pouvant être mis à jour avec pip
Procédure de création d'application multi-plateforme avec kivy
Créez une application Web qui convertit le PDF en texte à l'aide de Flask et PyPDF2
Facile à créer une application console Python avec Click
Module de grattage "Gaspacho" qui peut être utilisé plus facilement que Beautiful Soup
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [1]. (La profondeur peut maintenant être modifiée en PNG.)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Ecrire un modèle de base)
Convertir des images du SDK FlyCapture en un formulaire pouvant être utilisé avec openCV
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Traitement d'authentification)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Expérience sur la page d'administration)
Créez un indicateur dans les paramètres qui seront True uniquement lors du test avec Django
[Python] Introduction au scraping WEB | Résumé des méthodes pouvant être utilisées avec webdriver
J'ai essayé de faire une application mémo qui peut être pomodoro, mais un enregistrement de réflexion
Comment créer une propriété de relations qui peuvent être prefetch_related par des conditions spécifiques
Créer une application Todo avec Django REST Framework + Angular
Créez une application graphique native avec Py2app et Tkinter
Essayez de créer une application Todo avec le framework Django REST
Pourquoi ne pas créer facilement une table élégante avec Python?
Liste des couleurs pouvant être définies avec tkinter (mémorial)
Notes sur les connaissances Python utilisables avec AtCoder
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
Créer une application Todo avec Django ③ Créer une page de liste de tâches
Créez une application qui devine les étudiants avec la version python-GUI
Créer une application Todo avec Django ⑤ Créer une fonction d'édition de tâches
Déployez des applications Web en temps réel avec Swampdragon x Apache