[Python] Zeichnen Sie ein Qiita-Tag-Beziehungsdiagramm mit NetworkX

Einführung

Ich werde erklären, wie die Python-Bibliothek NetworkX am Beispiel eines Beziehungsdiagramms von Tags verwendet wird, die an Qiita-Posts angehängt sind. Mit NetworkX können Sie ein Diagramm von Knoten und Kanten zeichnen, wie unten gezeigt. sample.png

Ausführungsumgebung

Erfassung von Originaldaten

Qiita veröffentlicht eine API zum Abrufen von Posts, sodass Sie Posts problemlos abrufen können. Konvertieren Sie die im JSON-Format zurückgegebenen Daten in ein Python-Wörterbuch mit dem folgenden Code. Bei Nichtauthentifizierung gibt es ein Limit von 100 Artikeln pro Anfrage und 60 Mal pro Stunde. Dieses Mal werden wir 100 * 60 = 6000 Artikel anvisieren.

import requests
import json

items = []
params = {"page":1, "per_page":100}
for i in range(60):
    print("fetching... page " + str(i+1))
    params["page"] = i + 1
    res = requests.get("https://qiita.com/api/v2/items", params=params)
    items.extend(json.loads(res.text))

Datenaufbereitung

Extrahieren Sie für die von der API erfassten Daten nur die Tags und konvertieren Sie sie in das Format "[[tag1, tag2], [tag3], ...]".

tags_list = []
for item in items:
    tags = [tag["name"] for tag in item["tags"]]
    tags_list.append(tags)

Verwenden Sie außerdem collection.Counter, um die Anzahl der Vorkommen von Tags zu zählen. Zu diesem Zeitpunkt wird das Mehrfacharray mit "itertools.chain.from_iterable (tags_list)" reduziert. Wenn zu viele Knoten vorhanden sind, wird die Figur durcheinander gebracht. Extrahieren Sie also die Top-50-Tags.

import collections
import itertools

tag_count = collections.Counter(itertools.chain.from_iterable(tags_list)).most_common(50)

Verwendung von NetworkX

Von hier aus werden wir NetworkX verwenden, um ein Diagramm zu erstellen.

Initialisierung und Hinzufügen von Knoten

Erstellen Sie ein neues Diagramm mit "G = nx.Graph ()" und fügen Sie Knoten mit Tag-Namen hinzu. Um die Größe des Knotens zum Zeitpunkt des späteren Zeichnens zu bestimmen, wird die Anzahl der Vorkommen "count" in das Attribut des Knotens eingegeben.

import networkx as nx
G = nx.Graph()
G.add_nodes_from([(tag, {"count":count}) for tag,count in tag_count])

Kante hinzufügen

Wenn ein Beitrag mehrere Tags enthält, fügen Sie allen Kombinationen Kanten hinzu Wenn Sie beispielsweise einen Beitrag mit dem Tag "Python, networkx, Qiita" wie diesen Artikel haben Erstellen Sie Kanten zwischen Python-Knoten und Networkx-Knoten, zwischen Networkx und Qiita sowie zwischen Qiita und Python. Wenn die Kante bereits vorhanden ist, erhöhen Sie das "Gewicht" der Kante.

for tags in tags_list:
    for node0,node1 in itertools.combinations(tags, 2):
        if not G.has_node(node0) or not G.has_node(node1):
            continue
        if G.has_edge(node0, node1):
            G.edge[node0][node1]["weight"] += 1
        else:
            G.add_edge(node0, node1, {"weight":1})

Zeichnen wir ein Diagramm

Zeichnen wir hier ein Diagramm.

%matplotlib inline
import matplotlib.pyplot as plt

plt.figure(figsize=(15,15))
pos = nx.spring_layout(G)
nx.draw_networkx(G,pos)

plt.axis("off")
plt.savefig("default.png ")
plt.show()

default.png

Ich habe eine Grafik, die ich nicht verstehe.

Anpassung der Grafikzeichnung

Von hier aus werden wir verschiedene Anpassungen vornehmen, um das Diagramm sauberer zu machen.

Kantenschnitt

Löschen Sie weniger häufig auftretende Kanten.

for (u,v,d) in G.edges(data=True):
    if d["weight"] <= 4:
        G.remove_edge(u, v)

Einstellung der Abstoßungskraft

In "pos = nx.spring_layout (G)" wird die Position des Knotens durch die Abstoßungskraft zwischen den Knoten und die Anziehungskraft aufgrund der Größe des "Gewichts" der Kante bestimmt. Die Abstoßungskraft zwischen Knoten kann durch Angabe des Arguments "k" eingestellt werden. Je größer das "k" ist, desto näher ist die Anordnung der Knoten an einem Kreis.

pos = nx.spring_layout(G, k=0.3)

Knotengröße und japanische Anzeige von Knotenbezeichnungen

Je größer die Anzahl ist, desto größer ist der Knotenkreis. In der vorherigen Ausgabe der Abbildung wird Japanisch nicht als Quadrat angezeigt. Legen Sie daher eine Schriftart fest, die Japanisch anzeigen kann.

node_size = [ d["count"]*20 for (n,d) in G.nodes(data=True)]
nx.draw_networkx_nodes(G, pos, node_color="w",alpha=0.6, node_size=node_size)
nx.draw_networkx_labels(G, pos, fontsize=14, font_family="Yu Gothic", font_weight="bold")

Kantendicke

Verdicken Sie die Kante entsprechend dem "Gewicht" der Kante.

edge_width = [ d["weight"]*0.2 for (u,v,d) in G.edges(data=True)]
nx.draw_networkx_edges(G, pos, alpha=0.4, edge_color="c", width=edge_width)

Klicken Sie hier, um zu zeichnen

Zeichnen Sie mit diesem Code. Versuchen Sie es mehrmals auszuführen oder ändern Sie die Parameter, bis das resultierende Diagramm gut aussieht.

%matplotlib inline
import matplotlib.pyplot as plt
import math

for (u,v,d) in G.edges(data=True):
    if d["weight"] <= 4:
        G.remove_edge(u, v)
    
plt.figure(figsize=(15,15))
pos = nx.spring_layout(G, k=0.3)

node_size = [ d['count']*20 for (n,d) in G.nodes(data=True)]
nx.draw_networkx_nodes(G, pos, node_color='w',alpha=0.6, node_size=node_size)
nx.draw_networkx_labels(G, pos, fontsize=14, font_family="Yu Gothic", font_weight="bold")

edge_width = [ d['weight']*0.2 for (u,v,d) in G.edges(data=True)]
nx.draw_networkx_edges(G, pos, alpha=0.4, edge_color='C', width=edge_width)

plt.axis('off')
plt.savefig("g2.png ")
plt.show()

graph2.png Web (Ruby (on Rails), JavaScript, PHP ...) oben, Python (maschinelles Lernen) unten links, iOS in der Mitte, Windows 10-Themen, die Bash unten rechts verwenden kann ... Wie Sie sehen können, haben wir ein Diagramm erstellt, das beliebte Tags und ihre Beziehungen zeigt.

Recommended Posts

[Python] Zeichnen Sie ein Qiita-Tag-Beziehungsdiagramm mit NetworkX
Zeichnen Sie mit NetworkX ein Diagramm
Zeichnen Sie mit networkx ein Diagramm
Zeichnen Sie ein CNN-Diagramm in Python
Sie können es mit Kopie versuchen! Lassen Sie uns ein cooles Netzwerkdiagramm mit networkx von Python zeichnen
Stock Number Ranking von Qiita Tag mit Python
[Python] Zeichnen Sie mit Dash Cytoscape ein gerichtetes Diagramm
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
[Python] Zeichne eine Mickey Mouse mit Turtle [Anfänger]
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Zeichnen Sie gewaltsam so etwas wie ein Flussdiagramm mit Python, matplotlib
[Python] Löschen Sie, indem Sie ein Tag mit Beautiful Soup angeben
[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
Mathematik mit Python studieren: Zeichnen Sie mit matplotlib ein Sympy-Diagramm (Scipy-Diagramm)
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Bedienen Sie den Belegdrucker mit Python
Python-Grafikhandbuch mit Matplotlib.
Zeichne ein Diagramm mit Julia + PyQtGraph (2)
Lassen Sie uns eine GUI mit Python erstellen.
Löse ABC166 A ~ D mit Python
Zeichnen Sie eine Streudiagrammmatrix mit Python
Zeichnen Sie mit matplotlib ein loses Diagramm
Quine Post mit Qiita API (Python)
Erstellen Sie eine virtuelle Umgebung mit Python!
Ich habe mit Python eine Lotterie gemacht.
Zeichne einen schönen Kreis mit Numpy
Zeichne ein Diagramm mit Julia + PyQtGraph (1)
Erstellen einer virtuellen Umgebung mit Python 3
Zeichne ein Diagramm mit Julia + PyQtGraph (3)
Löse ABC168 A ~ C mit Python
Zeichnen Sie eine Aquarellillusion mit Kantenerkennung in Python3 und openCV3
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
Holen Sie sich Qiita-Trends mit Python-Scraping
Zeichnen Sie ein Diagramm mit Pandas + XlsxWriter
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Zeichnen Sie eine Illustration mit Python + OpenCV
Zeichne Riapnov Fractal mit Python, matplotlib
Zeichnen Sie ein Diagramm mit der PySimple-Benutzeroberfläche
[Python] Erbt eine Klasse mit Klassenvariablen
Ich habe mit Python einen Daemon erstellt
Zeichnen Sie einfach eine Karte mit matplotlib.basemap
Schreiben Sie ein Batch-Skript mit Python3.5 ~
Zeichnen Sie einen Pfeil (Vektor) mit opencv / python
Ich habe ein Systemkonfigurationsdiagramm mit Diagrams on Docker geschrieben
Wie zeichnet man eine vertikale Linie auf einer Heatmap, die mit Python Seaborn gezeichnet wurde?
Erstellen Sie eine Python3-Umgebung mit pyenv auf einem Mac und zeigen Sie NetworkX-Diagramme an
[Pyenv] Erstellen einer Python-Umgebung mit Ubuntu 16.04
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Erstellen Sie mit Class einen Python-Funktionsdekorator