Python networkx: показывать разные цвета для одного узла - PullRequest
2 голосов
/ 18 июня 2020

У меня есть список подграфов, и я хочу напечатать его на одном изображении, я добавил все узлы в графе G, но я хочу сохранить информацию о своих подграфах, поэтому я дал один цвет каждому node, а когда узел принадлежит 2 подграфам, он имеет 2 цвета (3 принадлежат 3, 4 к 4, ...).

Моя проблема состоит в том, чтобы показать узлы со всеми частями их цветов и их лейблы на одной картинке, конечно, на позициях Райта. Я тоже хочу добавить фон к изображению, и это изображение не появляется в том же сюжете, но я бы показал его на том же сюжете.

plt.figure(figsize=(22,18))

plt.imshow(background, origin='lower', cmap="binary", alpha=0.5)

nodes = nx.draw_networkx_nodes(G, pos=posi)
nx.draw_networkx_labels(G, pos=posi)

for node in G.nodes() :
   plt.pie([1]*pgm, center=posi[node], colors = [cmap(a) for a in colors[node]])
plt.show()
plt.close()

Меня вдохновило Создание круговая диаграмма как узлы в Networkx .

Знаете ли вы, как я могу назначить разные цвета одному и тому же узлу и распечатать их метки и фон на одном изображении?

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

enter image description here

def plotGraph2(List_sous_graphe, background) :
    SS_Graphe = renomme_ss_graphe(List_sous_graphe)
    for popu in range(0,1) :
        vim = 0
        vmax = len(SS_Graphe[popu])
        G = nx.Graph()
        colors_n = {}
        nb_col_n = {}
        size_n = {}
        for g in range(vim, vmax):
            taille_noeud = SS_Graphe[popu][g].graph['support']
            #couleur c'est g le numéro du graphe
            #color i the g number
            for n in SS_Graphe[popu][g].nodes():
                if not G.has_node(n) :
                    colors_n [n] = [g]
                    nb_col_n [n] = 1
                    size_n [n] = taille_noeud
                    G.add_node(n)
                    #print("N'a pas")
                else :
                    #print(SS_Graphe[popu][g].nodes[n])
                    colors_n [n].append(g)
                    nb_col_n [n] = nb_col_n [n] + 1

    max_value_n = max(nb_col_n.values())

    pgm = plus_grand_mutiple(max_value_n)

    #Pour chaque noeud
    for n in colors_n :
        tab[n] = []
        #Pour chaque couleur du noeud
        for i in range(0, nb_col_n[n]) :
            #On rajoute chaque couleur un nombre de fois pgm divisé par le nombre de couleur du noeud
            #print(pgm/nb_col_n[n])
            for j in range(0, int(pgm/nb_col_n[n])):
                #print(colors_n[n])
                tab[n].append(colors_n[n][i])

    a = np.array(list(tab.values()))
    maxes = np.max(a, axis=0)

    colors= {}
    for key, val in tab.items():
        colors[key] = list(np.array(val)/maxes)

    #Then the plt.pie that you see in the above message

Вы можете видеть, что некоторые узлы имеют 2 цвета: https://media.discordapp.net/attachments/590286639075688449/723124784988160000/Capture_decran_de_2020-06-18_12-36-46.png?width=536&height=410 Это часть моего изображения, я просто делаю снимок экрана

Извините за французский комментарий в моем коде, иногда я забывал комментировать английский sh

My pictures

0 голосов
/ 18 июня 2020

У меня примерно так:

def plot3(List, background) :

    graphs = []

    for i, df in enumerate(List[0]):
        G = List[0][i]
        for node in G.nodes:
            G.nodes[node]['part_of'] = []
        graphs.append(G.copy())


    F = nx.Graph()
    for G in graphs:
        F = nx.compose(F,G)
    nx.draw(F)
    print(F.number_of_nodes(), F.number_of_edges())
    print(len(List[0]))

    for node in F.nodes():
        for i, G in enumerate(graphs):        
            if node in G.nodes():
                F.nodes[node]['part_of'].append(i)

    pos = nx.spring_layout(F)

    fig = plt.figure(figsize=(10,10))

    nx.draw_networkx_edges(F, with_labels=False, node_size=50, pos=pos, alpha=.3)# node_color=colors,

    cmap=plt.cm.viridis

    for node in F.nodes():
        part_of = list(set(F.nodes[node]['part_of']))
        w = plt.pie(
            [1]*len(part_of),
            center= pos[node],
            colors=[cmap(q/len(graphs)) for q in part_of],
            radius=0.05,
        )

    return 1

enter image description here

0 голосов
/ 18 июня 2020

не элегантно и неэффективно, но я думаю, что это должно делать то, что вы хотите

# dummy graph
df1 = pd.DataFrame({a:np.random.randint(0,8,100) for a in 'ab'})
df2 = pd.DataFrame({a:np.random.randint(5,15,100) for a in 'ab'})
df3 = pd.DataFrame({a:np.random.randint(12,20,100) for a in 'ab'})
df4 = pd.DataFrame({a:np.random.randint(19,25,100) for a in 'ab'})

graphs = []

for i, df in enumerate([df1,df2,df3,df4]):
    G = nx.from_pandas_edgelist(df, source='a', target='b')
    for node in G.nodes:
        G.nodes[node]['part_of'] = []
    graphs.append(G.copy())

F = nx.Graph()
for G in graphs:
    F = nx.compose(F,G)


# actual answer

for node in F.nodes():
    for i, G in enumerate(graphs):        
        if node in G.nodes():
            F.nodes[node]['part_of'].append(i)

pos = nx.spring_layout(F)

fig = plt.figure(figsize=(10,10))
cmap=plt.cm.viridis

nx.draw_networkx_edges(F, pos=pos,)

for node in F.nodes():
    part_of = list(set(F.nodes[node]['part_of']))
    w = plt.pie(
        [1]*len(part_of),
        center= pos[node],
        colors=[cmap(q/len(graphs)) for q in part_of],
        radius=0.05,
    )

plt.xlim(-2,2)
plt.ylim(-2,2)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...