Domanda

Si tratta di una sfida molto specifica inforgraphic ospitarci la questione fundemental è come si fa a costruire archi tra le parole usando matplotlib, Cario o un altro libary pitone.

Data una la seguente struttura di dati.

io, tu, 7 | me, mela, 9 | mela, si, 1 | moto, mi, 5

I nomi sarebbero stati visualizzati in senso orizzontale i nomi con il maggior numero di rapporti più grandi rispetto agli altri e archi allora non ci sarebbe ponderata tra i nomi. A 10 arco ponderato sarebbe due volte più spesso come un arco pesata 5.

L'ispirazione proviene da: diverstiy simile. http://similardiversity.net/

Che la sfida abbia inizio!

È stato utile?

Soluzione

Ci sono diverse librerie, almeno uno dei quali si affida il Matplotlib, che farà quello che si desidera. Vi consiglio NetworkX (www.networkx.lanl.gov) per costruire la struttura del grafico, e che è quindi possibile utilizzare per chiamare i relativi metodi matplotlib per tracciare. NetworkX e Matplotlib lavorano molto bene insieme.

import networkx as NX
import matplotlib.pyplot as PLT
Gh = NX.Graph()
Gh.add_edge("You", "Bike", weight=1.0)
Gh.add_edge("Bike", "Apple", weight=0.9)
Gh.add_edge("Me", "Bike", weight=1.1)
all_nodes = Gh.nodes()
# to scale node size with degree:
scaled_node_size = lambda(node) : NX.degree(Gh, node) * 700
position = NX.spring_layout(Gh)    # just choose a layout scheme
NX.draw_networkx_nodes(Gh, position, node_size=map(scaled_node_size, all_nodes))
NX.draw_network_edges(Gh, position, Gh.edges(), width=1.0, alpha=1.0, edge_color="red")
# now for the Matplotlib part:
PLT.axis("off")
PLT.show()

Come si può vedere, è possibile scalare i bordi applicando un fattore di variare il parametro 'peso' su qualsiasi metodi 'bordo', allo stesso modo come ho fatto per scalatura nodo.

Io consiglio anche pygraphviz (ovviamente usando graphviz come backend). E 'molto simile a Netwworkx (lo stesso sviluppatore).

scroll top