Подтвердить что ты не робот

Визуализация большого графа с помощью python и networkx

У меня возникают проблемы с большой визуализацией графа в python и networkx. График - желание визуализировать направленность и имеет размер ребра и вершины 215 000. Из документации (которая связана на верхней странице) ясно, что networkx поддерживает построение с помощью matplotlib и GraphViz. В matplotlib и networkx рисунок выполняется следующим образом:

import 
networkx as nx
import matplotlib.pyplot as plt
#Let g be a graph that I created
nx.draw(g)

Я получаю ошибку памяти после nx.draw(g), после этого вы обычно делаете plt.show() или plt. [some_function], чтобы сохранить файл в формате для эффективного и т.д.

Далее я попробовал GraphViz. На странице wikipedia формат dot используется для ориентированных графиков, и я создал файл-точку:

nx.write_dot(g, "g.dot")

Это сработало хорошо, и у меня был точечный файл в моем текущем каталоге, который составляет 12 мегабайт. Затем я запустил программу dot (часть graphviz для создания файла postscript):

dot -Tps g.dot -o g.ps

Это замедляет работу моего компьютера, работает в течение нескольких минут, а затем отображает Killed в терминале. Поэтому он никогда не смог выполнить... При чтении документации для graphviz кажется, что для визуализации большого графа поддерживаются только неориентированные графики.

Вопрос: С этими двумя неудачными попытками кто-нибудь может показать мне, как визуализировать мой большой график, используя python и networkx с примерно 215 000 вершин и 215 000 ребер? Я подозреваю, что с Graphviz мне придется выводить в промежуточный формат (хотя это не должно быть так сложно, что это будет не так просто, как встроенная функция), а затем использовать другой инструмент для чтения промежуточного формата, а затем выводят визуализацию.

Итак, я ищу следующее:

  • Вывести график из сети в промежуточный формат
  • С новым пакетом/программным обеспечением/инструментом (в идеале python-interactive) читайте промежуточный формат и визуализируйте большой график

Если вам нужна дополнительная информация, дайте мне знать!

4b9b3361

Ответ 1

 from matplotlib import pylab
 import networkx as nx

 def save_graph(graph,file_name):
    #initialze Figure
    plt.figure(num=None, figsize=(20, 20), dpi=80)
    plt.axis('off')
    fig = plt.figure(1)
    pos = nx.spring_layout(graph)
    nx.draw_networkx_nodes(graph,pos)
    nx.draw_networkx_edges(graph,pos)
    nx.draw_networkx_labels(graph,pos)

    cut = 1.00
    xmax = cut * max(xx for xx, yy in pos.values())
    ymax = cut * max(yy for xx, yy in pos.values())
    plt.xlim(0, xmax)
    plt.ylim(0, ymax)

    plt.savefig(file_name,bbox_inches="tight")
    pylab.close()
    del fig

#Assuming that the graph g has nodes and edges entered
save_graph(g,"my_graph.pdf")

#it can also be saved in .svg, .png. or .ps formats

Это ответ на ваш первый вопрос. Networkx не имеет возможности масштабировать узлы. Используйте Gephi для этой функции. Gephi принимает список ребер в формате CSV и создает визуализацию, в которой масштабирование может выполняться в интерактивном режиме.