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.
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))
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)
Von hier aus werden wir NetworkX verwenden, um ein Diagramm zu erstellen.
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])
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 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()
Ich habe eine Grafik, die ich nicht verstehe.
Von hier aus werden wir verschiedene Anpassungen vornehmen, um das Diagramm sauberer zu machen.
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)
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)
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")
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)
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()
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