2015-08-24 2 views
5

Я просто хочу, чтобы нарисовать простой граф с Python 3 NetworkX & Graphviz:Python 3 NetworkX draw_graphviz() не работает

import networkx as nx 

G = nx.complete_graph(3) 
nx.draw_graphviz(G) 

Я использую ubuntu14.04 и IPython3 и, как обычно, я установить PIP3 NetworkX и работает код дал мне:

ImportError: pydot could not be loaded: http://code.google.com/p/pydot/ 

и я попытался установить pydotplus и запустить код:

/usr/local/lib/python3.4/dist-packages/networkx/drawing/nx_pydot.py in pydot_layout(G, prog, root, **kwds) 
    294 
    295   if isinstance(node,list): 
--> 296    node=node[0] 
    297   pos=node.get_pos()[1:-1] # strip leading and trailing double quotes 
    298   if pos != None: 

IndexError: list index out of range 

и pydot2 также:

/usr/local/lib/python3.4/dist-packages/pydot.py in write(self, path, prog, format) 
    1893    prog = self.prog 
    1894 
-> 1895   dot_fd = file(path, "w+b") 
    1896   if format == 'raw': 
    1897    data = self.to_string() 

NameError: name 'file' is not defined 

Я потратил некоторое время на поиски и не устанавливая другие pydots и комбинации pygraphviz уже, но все еще не повезло.

Хотя это может быть связано: pydot and graphviz error: Couldn't import dot_parser, loading of dot files will not be possible, что не решает проблему в Python 3.

+0

ли это https: // группы .google.com/forum/#! topic/pygraphviz-discuss/mbK5voZ9-hs объясняют некоторые проблемы? – Joel

+0

Я думаю, что pygraphviz зависит от разбора языка [DOT] (https://en.wikipedia.org/wiki/DOT_%28graph_description_language%29), который является задачей pydot? И теперь как-то это pydot, что несовместимо с Python3, а не pygraphviz. – pterodragon

+0

FWIW, я достиг желаемого результата, выведя файл .dot, используя 'networkx.write_dot (G, 'graph.dot')', а затем выполните соответствующую команду вывода графика, например 'neato -T png graph.dot> graph.png '. (graphviz должен быть установлен заранее, см. справочную страницу для более) – pterodragon

ответ

2

Вы можете это исправить, отредактировав линию #292 от:

pydot_node = pydot.Node(make_str(n)).get_name().encode('utf-8') 

удалить закодировать в конце:

pydot_node = pydot.Node(make_str(n)).get_name() #.encode('utf-8') 

Я сообщил об этом ошибка/исправить here.

+0

Он разрешает ошибку при использовании pydotplus в этом случае :). Но я все еще не вижу всплывающее окно matplotlib? – pterodragon

+0

@pterodragon Является ли matplotlib в интерактивном режиме? Возможно, вам понадобится сделать 'plt.show()', чтобы окно появилось. – mfitzp

+0

Я думал, что это покажет автоматически. Спасибо за вашу помощь! :) – pterodragon

1

Не очень большой ответ, но он действует как обходной путь.

Первый выводить .dot файл по networkx.write_dot(G, 'graph.dot') с использованием Python

, а затем выполнить соответствующую команду вывода Graphviz как neato -T png graph.dot > graph.png в командной строке.

2

Это, похоже, та же проблема, что и pydot, который вы используете, - это версия, несовместимая с Python 3, которая использует файл (...). файл (...) уже удален в Python 3.

Я заметил эту проблему и установил совместимую с Python версию на PyPi.

Для систем Linux для Python 3.x, попробуйте:

pip3 install pydot3

Или вообще для Python 2.x, попробуйте:

pip install pydot3