[PYTHON] Zeichnen einer Baumstruktur mit D3.js in Jupyter Notebook

Was du machen willst

Ich möchte schöne Baumstrukturdaten mit Jupyter Notebook oder einer Webanwendung zeichnen! Das ist meine Motivation. Ich verwende Python, um die Originaldaten bequem analysieren zu können, und wollte die Analyse und Visualisierung interaktiv wiederholen.

Python Es scheint viele Möglichkeiten zu geben, eine Baumstruktur in Python zu zeichnen, und die erste, die mir in den Sinn kommt, ist networkx und [graphviz]. Ich verwende eine Diagrammbibliothek wie (https://graphviz.readthedocs.io/en/stable/), aber da der Zweck darin besteht, die Diagrammstruktur zu analysieren, halte ich ausgefeilte Ausdrücke für schwierig.

Auf der anderen Seite gibt es ETE Toolkit als spezielles Analyse- und Visualisierungswerkzeug für Baumstrukturen. Das Modell wird im Newick-Format dargestellt, das eine bekannte Darstellung der Baumstruktur zu sein scheint. Das sieht ziemlich gut aus, aber angesichts der Kompatibilität im Web wollte ich etwas Vielseitigeres wie JSON verwenden, um das Modell zu beschreiben.

Javascript Eine gute Zusammenfassung der Zeichnungsgraphenstrukturen in Javascript finden Sie hier [https://qiita.com/d0nchaaan/items/c47dc74cfefd92516e28]. Es gibt verschiedene Dinge, aber in Bezug auf Vielseitigkeit und Informationsmenge denke ich, dass es D3.js ist. Es gibt auch eine Bibliothek zum Zeichnen von Bäumen.

Also werde ich versuchen, mit Jup3.ter Notebook eine Baumstruktur mit D3.js zu zeichnen. Jupyter Notebook hat von Anfang an eine gute Affinität, da es Javascript ausführen und HTML zeichnen kann, während der Python-Kernel mithilfe von Zellmagie (%% Javascript) verwendet wird.

Verwenden von D3.js mit Jupyter Notebook

Als Methode können Sie Javascript Cell Magic oder py_d3 verwenden. Ersteres ist mit RequireJS nur schwer intuitiv zu verstehen (siehe hier). Letzteres scheint die Zellmagie von Javascript gut zu verpacken. Hier erkläre ich das Zeichnen mit py_d3.

Vorbereitung

Wie auch immer, installieren Sie py_d3. Verwenden Sie pip. pip install py_d3 Laden Sie das Modul zunächst wie folgt:

import py_d3
py_d3.load_ipython_extension(get_ipython())

Unten finden Sie ein Beispielzitat von der Homepage. Das erste %% d3 5.12.0 gibt die Version von d3.js an. Sie können herausfinden, welche Version verfügbar ist, indem Sie "% d3 version" eingeben.


%%d3 5.12.0

<g></g>

<style>
element {
    height: 25px;
}
div.bar {
    display: inline-block;
    width: 20px;
    height: 75px;
    margin-right: 2px;
    background-color: teal;
}
</style>

<script>
var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13,
                11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ];

d3.select("g").selectAll("div")
    .data(dataset)
    .enter()
    .append("div")
    .attr("class", "bar")
    .style("height", function(d) {
        var barHeight = d * 5;
        return barHeight + "px";
    });
</script>

Sie können die Ausgabe des Diagramms wie unten gezeigt überprüfen. image.png

Datenverknüpfung mit Python

Durch die vollständige Nutzung von RequireJS ist es möglich, in Python berechnete Objekte und Variablen in die definierte Javascript-Funktion einzugeben. Es unterscheidet sich jedoch nicht wesentlich von der Ausgabe in JSON und dem Lesen in d3.js. Wenn die Daten also nicht sehr groß sind, ist es einfach, die Zwischendatei durchzugehen. Bereiten Sie beispielsweise eine JSON-Datei mit Baumstruktur vor, wie unten gezeigt.

import json
data = {
    "name": "A",
    "children": [
      { "name": "B" },
      {
        "name": "C",
        "children": [{ "name": "D" }, { "name": "E" }, { "name": "F" }]
      },
      { "name": "G" },
      {
        "name": "H",
        "children": [{ "name": "I" }, { "name": "J" }]
      },
      { "name": "K" }
    ]
  };
json_file = open('test.json', 'w')
json.dump(data, json_file)

Zeichnung der Baumstruktur

Verwenden Sie das Baumlayout von d3-Hierarchie, um die Baumstruktur zu zeichnen. Nachdem Sie die JSON-Datenstruktur geladen und einen Baum basierend auf diesen Daten erstellt haben, müssen Sie lediglich die SVG-Zeichnung anpassen. Informationen zur Feineinstellung der Zeichnung finden Sie in den Dokumenten d3.js und SVG.

%%d3 5.12.0

<style>
.link {
fill: none;
stroke: #555;
stroke-opacity: 0.4;
stroke-width: 1.5px;
}
</style>

<svg width="800" height="600"></svg>

<script>
var width = 800;
var height = 600;

var g = d3.select("svg").append("g")
    .attr("transform", "translate(80,0)");
     console.log("data");


d3.json("test.json")
    .then((data) => {
        console.log(data);
        var root = d3.hierarchy(data);
        var tree = d3.tree(root).size([height, width - 160]);
        tree(root);

        var link = g.selectAll(".link")
            .data(root.descendants().slice(1))
            .enter()
            .append("path")
            .attr("class", "link")
            .attr("d", (d) => {
                return "M" + d.y + "," + d.x +
                    "C" + (d.parent.y + 100) + "," + d.x +
                    " " + (d.parent.y + 100) + "," + d.parent.x +
                    " " + d.parent.y + "," + d.parent.x;
            });

        var node = g.selectAll(".node")
            .data(root.descendants())
            .enter()
            .append("g")
            .attr("class", "node")
            .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; })

        node.append("circle")
            .attr("r", 8)
            .attr("fill", "#999");

        node.append("text")
            .attr("dy", 3)
            .attr("x", function(d) { return d.children ? -12 : 12; })
            .style("text-anchor", function(d) { return d.children ? "end" : "start"; })
            .attr("font-size", "200%")
            .text(function(d) { return d.data.name; });
        })
   .catch((error)=>{
    
   }
)
</script>

image.png

Referenz

  1. Zusammenfassung von 7 Bibliotheken zum Zeichnen von Netzwerkgraphen
  2. Verwendung des D3.js v4 / v5-Baumbeispiels
  3. Umfangreiche Datenvisualisierung mit Jupyter Notebook x d3.js
  4. Custom D3.js Visualization in a Jupyter Notebook

Recommended Posts

Zeichnen einer Baumstruktur mit D3.js in Jupyter Notebook
Machen Sie einen Sound mit Jupyter Notebook
Zeichnen Sie in Jupyter ein Diagramm mit japanischen Beschriftungen
Grafikzeichnung mit Jupyter (Ipython-Notizbuch) + Matplotlib + Vagabund
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Verwenden von Graphviz mit Jupyter Notebook
HTML in Jupyter-Notizbuch anzeigen
Verwenden Sie pip mit Jupyter Notebook
Mehrfachverarbeitungsfehler in Jupyter Notebook
Verwenden Sie Cython mit Jupyter Notebook
Spielen Sie mit Jupyter Notebook (IPython Notebook)
Diagrammzeichnung mit IPython Notebook
Maschinelles Lernen mit Jupyter Notebook in einer OCI Always Free-Umgebung (17.12.2019)
Reflektieren Sie die von Miniconda erstellte virtuelle Umgebung im Jupyter-Notizbuch
Wird beim Starten von Jupyter Notebook (Windows) in einem neuen Fenster geöffnet.
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Die übliche Art, einen Kernel mit Jupyter Notebook hinzuzufügen
Schreiben Sie Diagramme in Echtzeit mit Matplotlib auf dem Jupyter-Notizbuch
Zeigen Sie dynamische Diagramme im Jupyter-Notizbuch an. (Inline-Anzeige von D3.js)
So importieren Sie NoteBook als Modul in Jupyter (IPython)
Versuchen Sie, mit einem gemischten Gaußschen Modell auf Jupyter Notebook zu gruppieren
Wird beim Starten von Jupyter Notebook automatisch in einem neuen Fenster geöffnet
Ermöglichen Sie externe Verbindungen mit dem Jupiter-Notebook
Starten eines mit Jupyter Notebook erstellten Python-Programms
Formatieren mit autopep8 auf Jupyter Notebook
Git-Management von Jupyter Notebook (ipynb) Unterschieden in JupyterLab für einfache Anzeige
Post Jupyter Notebook als Blog-Beitrag
Erstellen eines bestimmten Baums mit Scikit-Learn
Visualisieren Sie den Entscheidungsbaum mit einem Jupyter-Notizbuch
Ich wollte eine intelligente Präsentation mit Jupyter Notebook + nb present erstellen
Generieren Sie das Jupyter-Notizbuch ".ipynb" in Python
Erstellen Sie mit PsychoPy + Jupyter Notebook eine komfortable Umgebung für psychologische Experimente / Analysen
Markdown mit Jupyter-Notebook verwenden (mit Verknüpfung)
Fügen Sie mit Jupyter Notebook weitere Kernel hinzu
Zeigen Sie Diagramme inline in Jupyter Notebook an
Bequeme Analyse mit Pandas + Jupyter Notebook
3D-Zeichnung mit SceneKit in Pythonista
Sehen Sie sich die in Python 3.8.2 integrierte Ausnahmebaumstruktur an
[Kleine Geschichte] So speichern Sie Matplotlib-Diagramme in einem Stapel mit Jupyter
Ich wollte ein Jupyter-Notebook mit Docker in einer Pip-Umgebung (Opticspy) verwenden.
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Verwenden Sie nbextensions mit Anacondas Jupyter-Notizbuch
Verwenden von Apache Spark mit Jupyter Notebook (IPython Notebook)
Ausgabebaumstruktur von Dateien in Python
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Versuchen Sie, mit matplotlib eine Normalverteilung zu zeichnen
[Python] Zeichnen eines Wirbelmusters mit einer Schildkröte
Zeichne mit PyCall ein Herz in Ruby
Verwenden Sie Jupyter Lab und Jupyter Notebook mit EC2
Machen Sie Jupyter Notebook zu einem Dienst unter CentOS
Probieren Sie SVM mit scikit-learn auf Jupyter Notebook aus
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
So führen Sie Befehle mit einem Jupyter-Notebook aus
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch
Verwendung des Jupyter-Notebooks mit ABCI
Verknüpfung von Python und JavaScript mit dem Jupiter-Notizbuch
Zeichnen Sie mit graphviz eine Baumstruktur in Python 3
Versuchen Sie, eine Karte mit Python + Cartopy 0.18.0 zu zeichnen
[Jupyter Notebook Memo] Kanji mit Matplotlib anzeigen
Führen Sie Jupyter Notebook auf einem Remote-Server aus