tracciare un diagramma in pitone tipo set
Domanda
La breve domanda, c'è un off la funzione di auto per fare un grafico da un insieme di insiemi di pitone? La domanda più: ho diversi set di pitone. Ognuno di essi si sovrappongono o alcuni sono gruppi secondari degli altri. Vorrei fare un grafico (come in nodi e bordi) nodi sono gli elementi negli insiemi. I bordi sono intersezione degli insiemi con ponderata per il numero di elementi nella intersezione degli insiemi. Ci sono diversi pacchetti di grafici per Python. (NetworkX, IGRAPH, ...) non ho familiarità con l'uso di uno di essi. Qualcuno di loro fare un grafico direttamente da un elenco di gruppi cioè, MakeGraphfromSets (alistofsets) Se non lo sai di un esempio di come prendere la lista dei set per definire i bordi. Sembra in realtà che potrebbe essere semplice, ma un esempio è sempre bene avere.
Soluzione
Non è troppo difficile da codificare da soli:
def intersection_graph(sets):
adjacency_list = {}
for i, s1 in enumerate(sets):
for j, s2 in enumerate(sets):
if j == i:
continue
try:
lst = adjacency_list[i]
except KeyError:
adjacency_list[i] = lst = []
weight = len(s1.intersection(s2))
lst.append( (j, weight) )
return adjacency_list
Questi numeri funzione ogni insieme con l'indice entro sets
. Facciamo questo perché le chiavi dict devono essere immutabili, che è vero per gli interi, ma non imposta.
Ecco un esempio di come utilizzare questa funzione, e il suo output:
>>> sets = [set([1,2,3]), set([2,3,4]), set([4,2])]
>>> intersection_graph(sets)
{0: [(1, 2), (2, 1)], 1: [(0, 2), (2, 2)], 2: [(0, 1), (1, 2)]}
Altri suggerimenti
def MakeGraphfromSets(sets):
egs = []
l = len(sets)
for i in range(l):
for j in range(i,l):
w = sets[i].intersection(sets[j])
egs.append((i,j,len(w)))
return egs
# (source set index,destination set index,length of intersection)
sets = [set([1,2,3]), set([2,3,4]), set([4,2])]
edges = MakeGraphfromSets(sets)
for e in edges:
print e
USCITA:
(0, 0, 3)
(0, 1, 2)
(0, 2, 1)
(1, 1, 3)
(1, 2, 2)
(2, 2, 2)