Frage zum Grundverständnis Networkx

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
blubb10
User
Beiträge: 2
Registriert: Donnerstag 15. September 2016, 17:37

Hallo alle miteinander,

ich bin absoluter Neuling im Bereich Python. Nun muss ich mich aber aus beruflichen Gründen damit beschäftigen. Genauer gesagt mit der netwprkx-Bibliothek.

Ich habe inzwischen auch das Tutorial durchgearbeitet. Das Programmieren als solches ist nicht mein Problem.
Vielmehr habe ich ein Verständnisproblem. In der networkx-Bibliothek wird (dem Tutorial nach zu urteilen) viel mit nodes und edges gearbeitet. Das edges im Grunde genommen zwei nodes sind, soviel habe ich begriffen. Allerdings kann ich mir nicht so recht vorstellen was ich mit den nodes machen soll. Was mir die bringen.

Vielleicht kann mir das hier jemand erklären.

Vielen Dank und viele Grüße
BlackJack

@blubb10: Edges sind nicht zwei Nodes sondern werden nur durch zwei Nodes beschrieben. Ein Graph besteht aus Knoten (Nodes) und Kanten (Edges). Die Knoten sind die Punkte und die Kanten sind die Verbindungen zwischen den Knoten. Die werden halt durch die beiden Eckpunkte beschrieben. Knoten können Attribute haben, zum Beispiel einen Ortsnamen, und Kanten können auch Attribute haben, zum Beispiel eine Reisedauer und einen Typ (Auto, Bahn, Flugzeug, …). Zwischen zwei Knoten kann es auch mehr als eine Kante geben. Die können auch gerichtet sein. Bei den Beispielattributen kann man sich beispielsweise vorstellen, dass zwischen Hamburg und München jeweils Kanten für Auto, Bahn, und Flugzeug existieren. Oder zwischen Berlin und New York zwei Kanten für Flugzeug, eine in jede Richtung, weil sich die Reisedauer bei solchen Flügen davon abhängen kann ob man mit den Luftströmen, oder gegen die Luftströme fliegt.
blubb10
User
Beiträge: 2
Registriert: Donnerstag 15. September 2016, 17:37

Hallo BlackJack,

danke schonmal für deine Antwort.
Die Erklärung von dir leuchtet mir soweit ein. Sowas in die Richtung habe ich auch vermutet, allerdings ist in dem Networkx-Tutorial auch ein Teil für Grafen zeichnen drin. Mit matplotlip.
Und mir ist dabei aufgefallen, dass wenn ich die Nodes und Edges zeichnen lasse, sie nicht dort sind, wo ich sie vermutet hätte. Beim Matplotlib-Fenster werden unten rechts die x- und y- Koordinate angezeigt. Wenn ich eine Edge erstelle bei (0,0) befindet sich dieser in der Zeichnung auch bei (x=0,y=0). Das fand ich auch logisch und nachvollziehbar. Als ich dann aber eine weitere Edge erstellte bei (1,1) befand sich dieser Punkt in der Zeichnung nicht - wie von mir erwartet - bei (x=1,y=1). Deswegen war ich mir auch überhaupt nicht sicher, ob ich mit meiner Vermutung richtig lag. Vor allem würde das bei den Nodes auch nicht hinkommen, da man hier ja einen Punkt angibt. Wobei mir bei der Zeichnung aufgefallen ist, dass zumindest der erste Node wieder genau auf dem angegebenen Wert, nur halt auf der y-Achse lag.
Wenn ich das dann richtig verstehe, werden die Punkte in der Zeichnung willkürlich gewählt, oder? Und das mir das Matplotlib-Fenster einen x- bzw. y-Wert anzeigt ist für mich in diesem Fall nicht wichtig? Habe ich das richtig verstanden?

Vielen Dank nochmal und viele Grüße

Blubb10
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Generell ist nicht die Position von Nodes in einem Graphen entscheidend sondern die Eigenschaften der Nodes und Edges, Gewichtung und Verbindungen etc. So eine Eigenschaft kann durchaus die Position in einem 2-Dimensionalen Koordinatensystem sein, allerdings kann das networkx nicht wissen.

Graphen sind gut im (versteckte) Informationen sichtbar zu machen, z.B. mit Gephi. Mit networkx exportieren und importieren in Gephi.
the more they change the more they stay the same
BlackJack

@blubb10: Du erstellst Edges, also Kanten, an Koordinaten? Du meinst wohl eher Knoten‽ Und wie erstellst Du einen Knoten bei (0, 0) oder (1, 1)? Das geht beim Graph selbst gar nicht, denn ein Graph hat solche Eigenschaften überhaupt nicht. Der hat bloss Knoten und Kanten. Erst wenn man einen Graphen visuell darstellen will, braucht man Koordinaten für die Knoten und gegebenfalls noch zusätzliche für die Kanten wenn das nicht einfach nur gerade Linien zwischen den Knoten sein sollen. In dem Falle reichen die Koordinaten der Knoten ja aus um die Kanten zu zeichnen.

Und beim zeichnen braucht man dann Koordinaten für Knoten und kann die entweder als Abbildung Knoten→Koordinate als optionales Argument mitgeben, oder `networkx` Positionen auswählen lassen. Beziehungsweise eventuell auch das Backend wenn man so etwas wie Graphviz für's zeichnen verwendet.

Edit: Ich weiss ja nicht was Du gemacht hast, aber *so* kann man zum Beispiel zwei Knoten zeichnen, einen bei (0, 0) und den anderen bei (1,1):

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import networkx as nx
from matplotlib import pyplot as plt


def main():
    graph = nx.Graph()
    graph.add_nodes_from([0, 1])
    nx.draw(graph, {0: (0, 0), 1: (1, 1)})
    plt.show()


if __name__ == '__main__':
    main()
Antworten