[Python] Zeichnen Sie mit Dash Cytoscape ein gerichtetes Diagramm

Ich möchte einen beweglichen gerichteten Graphen zeichnen

Ich wollte ein gerichtetes Diagramm zeichnen, das in einem Browser wie Rs visNetwork in Python ausgeführt werden kann.

NetworkX scheint als Grafikbibliothek von Python berühmt zu sein, aber dieses Mal dachte ich, dass Dash Cytoscape mit einem Bild in der Nähe von Rs visNetwork verwendet werden könnte, also werde ich es testen. Ich werde es aufschreiben.

Starten Sie den Server lokal und überprüfen Sie das Diagramm im Browser.

Ziel

--Visualisieren Sie den gerichteten Graphen aus dem zweispaltigen Datenrahmen von und nach.

Umgebung

Vorbereitung

Bereiten Sie einen Kantendatenrahmen mit von und nach und Knoten vor

app.py


import pandas as pd

edges = pd.DataFrame.from_dict({'from':['TABLE_B', 'TABLE_C', 'TABLE_D', 'TABLE_A', 'TABLE_X', 'TABLE_X'],
                               'to': ['TABLE_A', 'TABLE_A', 'TABLE_A','TABLE_X', 'TABLE_K', 'TABLE_Z']})
nodes = set()
Speichert den Inhalt von Kante und Knoten in einer Liste

app.py


cy_edges = []
cy_nodes = []

for index, row in edges.iterrows():
    source, target = row['from'], row['to']

    if source not in nodes:
        nodes.add(source)
        cy_nodes.append({"data": {"id": source, "label": source}})
    if target not in nodes:
        nodes.add(target)
        cy_nodes.append({"data": {"id": target, "label": target}})

    cy_edges.append({
        'data': {
            'source': source,
            'target': target
        }
    })

<img width=""30%" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143058/7b672b05-fa5b-8f75-f2df-97f48e0ddfbd.png ">

Definieren Sie den Stil des Knotens / der Kante

app.py


stylesheet = [
    {
        "selector": 'node', #Für alle Knoten
        'style': {
            "opacity": 0.9,
            "label": "data(label)", #Die Bezeichnung des anzuzeigenden Knotens
            "background-color": "#07ABA0", #Knotenfarbe
            "color": "#008B80" #Knotenbeschriftungsfarbe
        }
    },
    {
        "selector": 'edge', #Für alle Kanten
        "style": {
            "target-arrow-color": "#C5D3E2", #Pfeilfarbe
            "target-arrow-shape": "triangle", #Pfeilform
            "line-color": "#C5D3E2", #Kantenfarbe
            'arrow-scale': 2, #Pfeilgröße
            'curve-style': 'bezier' #Standardkurve-Wenn es sich um einen Stil handelt, wird der Pfeil nicht angezeigt. Geben Sie ihn daher an
    }
}]

--Zentrieren Sie die Position des Pfeils

app.py


        "style": {
            "mid-target-arrow-color": "#C5D3E2",
            "mid-target-arrow-shape": "triangle",
        }

image.png

app.py


stylesheet  = [
    {
        "selector": 'node',
        'style': {
            "opacity": 0.9,
            "label": "data(label)",
            "background-color": "#07ABA0",
            "color": "#008B80"
        }
    },
    {
        "selector": '[label *= "alarm"]', #Nur Knoten, deren Bezeichnung Alarm ist"red"Zu
        'style': {
            "opacity": 0.9,
            "label": "data(label)",
            "background-color": "red",
            "color": "#008B80"
        }
    },
    {
        "selector": 'edge',
        "style": {

            "target-arrow-color": "#C5D3E2",
            "target-arrow-shape": "triangle",
            "line-color": "#C5D3E2",
            'arrow-scale': 2,
            'curve-style': 'bezier'
        }
    }
]

image.png

Layout definieren

app.py


app.layout = html.Div([
    dcc.Dropdown(
            id='dropdown-layout',
            options=[
                {'label': 'random',
                 'value': 'random'},
                {'label': 'grid',
                 'value': 'grid'},
                {'label': 'circle',
                 'value': 'circle'},
                {'label': 'concentric',
                 'value': 'concentric'},
                {'label': 'breadthfirst',
                 'value': 'breadthfirst'},
                {'label': 'cose',
                 'value': 'cose'}
            ], value='grid'
        ),
    html.Div(children=[
        cyto.Cytoscape(
            id='cytoscape',
            elements=cy_edges + cy_nodes,
            style={
                'height': '95vh',
                'width': '100%'
            },
            stylesheet=stylesheet #Geben Sie den zuvor definierten Stil an
        )
    ])

])

――Dieses Mal kann das Layout des Diagramms aus der Dropdown-Liste ausgewählt werden.

Erstellen Sie einen Rückruf, um das Layout zu aktualisieren

app.py


@app.callback(Output('cytoscape', 'layout'),
              [Input('dropdown-layout', 'value')])
def update_cytoscape_layout(layout):
    return {'name': layout}

Komplett

Voller Text

app.py


import pandas as pd

import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html

import dash_cytoscape as cyto

app = dash.Dash(__name__)
server = app.server

# prepare data
edges = pd.DataFrame.from_dict({'from':['earthquake', 'earthquake', 'burglary', 'alarm', 'alarm'],
                               'to': ['report', 'alarm', 'alarm','John Calls', 'Mary Calls']})
nodes = set()

cy_edges = []
cy_nodes = []

for index, row in edges.iterrows():
    source, target = row['from'], row['to']

    if source not in nodes:
        nodes.add(source)
        cy_nodes.append({"data": {"id": source, "label": source}})
    if target not in nodes:
        nodes.add(target)
        cy_nodes.append({"data": {"id": target, "label": target}})

    cy_edges.append({
        'data': {
            'source': source,
            'target': target
        }
    })

# define stylesheet
stylesheet = [
    {
        "selector": 'node', #Für alle Knoten
        'style': {
            "opacity": 0.9,
            "label": "data(label)", #Die Bezeichnung des anzuzeigenden Knotens
            "background-color": "#07ABA0", #Knotenfarbe
            "color": "#008B80" #Knotenbeschriftungsfarbe
        }
    },
    {
        "selector": 'edge', #Für alle Kanten
        "style": {
            "target-arrow-color": "#C5D3E2", #Pfeilfarbe
            "target-arrow-shape": "triangle", #Pfeilform
            "line-color": "#C5D3E2", #Kantenfarbe
            'arrow-scale': 2, #Pfeilgröße
            'curve-style': 'bezier' #Standardkurve-Wenn es sich um einen Stil handelt, wird der Pfeil nicht angezeigt. Geben Sie ihn daher an
    }
}]

# define layout
app.layout = html.Div([
    dcc.Dropdown(
            id='dropdown-layout',
            options=[
                {'label': 'random',
                 'value': 'random'},
                {'label': 'grid',
                 'value': 'grid'},
                {'label': 'circle',
                 'value': 'circle'},
                {'label': 'concentric',
                 'value': 'concentric'},
                {'label': 'breadthfirst',
                 'value': 'breadthfirst'},
                {'label': 'cose',
                 'value': 'cose'}
            ], value='grid'
        ),
    html.Div(children=[
        cyto.Cytoscape(
            id='cytoscape',
            elements=cy_edges + cy_nodes,
            style={
                'height': '95vh',
                'width': '100%'
            },
            stylesheet=stylesheet
        )
    ])
])

@app.callback(Output('cytoscape', 'layout'),
              [Input('dropdown-layout', 'value')])
def update_cytoscape_layout(layout):
    return {'name': layout}

if __name__ == '__main__':
    app.run_server(debug=False)
Lauf
$ python app.py

image.png

Ich denke, wir haben eine Netzwerkvisualisierung wie das visNetwork von R erreicht. Bitte probieren Sie es aus.

Referenz

Was ist ein gerichteter Graph? Dash Cytoscape

-Wenn Sie mit [NetworkX] zeichnen (https://networkx.github.io/documentation/stable/auto_examples/drawing/plot_directed.html)

networkx_sample.py


# https://networkx.github.io/documentation/stable/auto_examples/drawing/plot_directed.html#sphx-glr-auto-examples-drawing-plot-directed-py
# Author: Rodrigo Dorantes-Gilardi ([email protected])
import matplotlib as mpl
import matplotlib.pyplot as plt
import networkx as nx

G = nx.generators.directed.random_k_out_graph(10, 3, 0.5)
pos = nx.layout.spring_layout(G)

node_sizes = [3 + 10 * i for i in range(len(G))]
M = G.number_of_edges()
edge_colors = range(2, M + 2)
edge_alphas = [(5 + i) / (M + 4) for i in range(M)]

nodes = nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color='blue')
edges = nx.draw_networkx_edges(G, pos, node_size=node_sizes, arrowstyle='->',
                               arrowsize=10, edge_color=edge_colors,
                               edge_cmap=plt.cm.Blues, width=2)
# set alpha value for each edge
for i in range(M):
    edges[i].set_alpha(edge_alphas[i])

pc = mpl.collections.PatchCollection(edges, cmap=plt.cm.Blues)
pc.set_array(edge_colors)
plt.colorbar(pc)

ax = plt.gca()
ax.set_axis_off()
plt.show()

image.png

Recommended Posts

[Python] Zeichnen Sie mit Dash Cytoscape ein gerichtetes Diagramm
Zeichnen Sie mit NetworkX ein Diagramm
Zeichnen Sie mit networkx ein Diagramm
Zeichne ein Diagramm mit Julia + PyQtGraph (2)
Zeichnen Sie mit matplotlib ein loses Diagramm
Zeichne ein Diagramm mit Julia + PyQtGraph (1)
Zeichne ein Diagramm mit Julia + PyQtGraph (3)
Zeichnen Sie ein Diagramm mit Pandas + XlsxWriter
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Zeichnen Sie ein Diagramm mit der PySimple-Benutzeroberfläche
Mathematik mit Python studieren: Zeichnen Sie mit matplotlib ein Sympy-Diagramm (Scipy-Diagramm)
Zeichnen Sie ein Diagramm mit PyQtGraph Part 1-Drawing
Zeichnen Sie eine flache Oberfläche mit einem Matplotlib-3D-Diagramm
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Zeichnen Sie in Jupyter ein Diagramm mit japanischen Beschriftungen
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
Zeichnen Sie ein Diagramm mit den PyQtGraph Part 3-PlotWidget-Einstellungen
Zeichnen Sie ein Diagramm, indem Sie es mit Pandas groupby verarbeiten
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
[Python] Zeichne eine Mickey Mouse mit Turtle [Anfänger]
Zeichnen Sie ein Diagramm mit den Einstellungen von PyQtGraph Part 4-PlotItem
Zeichnen Sie ein Diagramm mit PyQtGraph Teil 6 - Anzeigen einer Legende
Zeichnen Sie ein Diagramm mit Python
Zeichnen Sie mit PyQtGraph Teil 5 ein Diagramm. Erhöhen Sie die Y-Achse
[Python] Zeichnen Sie ein Qiita-Tag-Beziehungsdiagramm mit NetworkX
Visualisieren Sie mit Cytoscape 2 Eisenbahnstreckendaten als Grafik
Zeichnen Sie gewaltsam so etwas wie ein Flussdiagramm mit Python, matplotlib
Zeichnen Sie ein Diagramm mit PyQtGraph Teil 2 - Detaillierte Ploteinstellungen
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
Zeichnen Sie eine netCDF-Datei mit Python
Machen Sie eine Lotterie mit Python
Zeichne ein Herz in Python
Erstellen Sie ein Verzeichnis mit Python
Ein Hinweis beim Erstellen eines gerichteten Diagramms mit Graphviz in Python
[Visualisierung] Ich möchte mit Plotly ein schönes Diagramm zeichnen
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Bedienen Sie den Belegdrucker mit Python
Python-Grafikhandbuch mit Matplotlib.
Lassen Sie uns eine GUI mit Python erstellen.
Löse ABC166 A ~ D mit Python
Zeichnen Sie eine Streudiagrammmatrix mit Python
Erstellen Sie eine virtuelle Umgebung mit Python!
Ich habe mit Python eine Lotterie gemacht.
Zeichne einen schönen Kreis mit Numpy
Erstellen einer virtuellen Umgebung mit Python 3
Löse ABC168 A ~ C mit Python
Erstellen Sie ein Empfehlungssystem mit Python
Zeichnen Sie mit Python Turtle eine Koch-Kurve
[Python] Generiere ein Passwort mit Slackbot
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Zeichnen Sie eine Illustration mit Python + OpenCV
Zeichnen Sie ein CNN-Diagramm in Python
Machen Sie eine schöne Grafik mit Plotly
Zeichne Riapnov Fractal mit Python, matplotlib
[Python] Erbt eine Klasse mit Klassenvariablen
Ich habe mit Python einen Daemon erstellt