Arco di relazione Infografica In Python
-
16-09-2019 - |
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!
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).
Altri suggerimenti
matplotlib
non è la libreria proprio qui, dato che non è un generale libreria grafica purpose. Quello che vi serve qui o è qualcosa di simile a Cairo , o molto più semplice, si può fare con le capacità grafiche di qualsiasi GUI toolkit, come ad esempio PyQt. Un altro approccio fattibile è PyGame, che ha buone capacità di disegno pure.
Se volete un esempio, si veda questo href="http://www.cairographics.org/samples/" rel="nofollow noreferrer"> pagina , il primo campione - arco. Basta scrivere le parole di testo e quindi utilizzare il codice d'arco per un arco di qualsiasi larghezza e colore tra di loro.
Io non vedo proprio dove la difficoltà o la sfida è. Tutto ciò che serve è una libreria grafica che può disegnare il testo e semicerchi, che è possibile in praticamente tutto. Non v'è alcuna necessità di curve di Bezier. Per esempio si potrebbe semplicemente creare un file in formato SVG (allora non avrete nemmeno bisogno di biblioteca e può ben incorporare questa in una pagina web e di utilizzare alcuni Javascript per renderlo interattivo).
Il tracciato attuale è semplice: il centro di un cerchio è nel mezzo tra le due parole, il raggio è la metà della distanza tra loro. È quindi possibile regolare la corsa in modo da riflettere le altre grandezze.