Networkx распространяет узлы и укорачивает этикетки - PullRequest
0 голосов
/ 25 октября 2018

У меня есть двудольный граф сетей.это код:

    G = nx.Graph()
    G.add_nodes_from(USsNames, bipartite=0) # Add the node attribute "bipartite"
    G.add_nodes_from(TCsNames, bipartite=1)
    G.add_weighted_edges_from(compoundArr)

    labeldict = {}


    # Separate by group
    pos = {}

    # Update position for node from each group
    pos.update({node: [1, index] for index, node in enumerate(USsNames)})
    pos.update({node: [2, index] for index, node in enumerate(TCsNames)})

    nx.draw(G, pos, node_size=10,with_labels=False)
    for p in pos:  # raise text positions
        pos[p][1] += 0.12

    # create the dictionary with the formatted labels
    edge_labels = {i[0:2]:'{0:.2f}'.format(i[2]['weight']) for i in G.edges(data=True)}

    # add the custom egde labels
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels,font_size=8)
    nx.draw_networkx_labels(G, pos,font_size=8)
    plt.show()

И вывод: enter image description here

Мне нужно расширить левые узлы, чтобы они расширились, и сократитьметки правых узлов (скажем, первые четыре символа).

Я пытался найти решение, но не смог его найти.Спасибо.

1 Ответ

0 голосов
/ 04 апреля 2019

Я восстановил ваш случай на основе сгенерированных данных примера.

Сначала у нас есть этот график.

enter image description here

РазмерЛевый массив намного меньше размера правого массива, поэтому левый массив рисуется непропорционально.Чтобы нарисовать его правильно, вы должны изменить свою функцию обновления положения:

pos.update({node: [1, index] for index, node in enumerate(USsNames)})

Мы знаем, что TCsNames больше USsNames, поэтому мы можем умножить каждый USsNames узел Y-позиция к их соотношению:

pos.update({node: [1, index*(len(TCsNames)/len(USsNames))] for index, node in enumerate(USsNames)})

Теперь у нас есть этот график:

enter image description here

Обрезатьметки узлов, вы должны изменить draw_networkx_labels с параметром labels:

nx.draw_networkx_labels(G, pos, labels=node_labels, font_size=8)

с node_labels, равным:

node_labels = {i: i[:5] for i in G.nodes} (5желаемая длина метки узла).

И, наконец, у нас есть график, который вам нужен:

enter image description here

...