2015-01-10 3 views
3

Я использую этот бит кода из примера примера символьной регрессии deap, и график отображается отлично, но я хочу, чтобы узлы расширялись как закругленные прямоугольники подгоните текст автоматически. (Я не хочу просто указывать размер узла с помощью проб и ошибок). Как мне это сделать?Python: networkx: Как сделать размер узла авторасширением, чтобы он соответствовал метке

# show tree 
import matplotlib.pyplot as plt 
import networkx 

nodes, edges, labels = gp.graph(bests[0]) 
graph = networkx.Graph() 
graph.add_nodes_from(nodes) 
graph.add_edges_from(edges) 
pos = networkx.graphviz_layout(graph, prog="dot") 

plt.figure(figsize=(7,7)) 
networkx.draw_networkx_nodes(graph, pos, node_size=900, node_color="w") 
networkx.draw_networkx_edges(graph, pos) 
networkx.draw_networkx_labels(graph, pos, labels) 
plt.axis("off") 
plt.show() 

ответ

0

Существует не простой способ сделать это с Matplotlib и NetworkX (конечно, можно с достаточным количеством коды). Graphviz делает отличную работу с ярлыками, и легко писать файлы формата dot из networkx для обработки с помощью Graphviz.
Также обратите внимание на https://github.com/chebee7i/nxpd, который может выполнять именно то, что вам нужно.

+0

У меня есть GraphViz и pygraphviz, установленные и работающие. Вы знаете или можете предоставить какой-либо конкретный пример кода для выполнения этого конкретного типа двоичного дерева с помощью pygraphviz? – user2514676

+0

Я нашел ответ здесь (там есть пример pygraphviz): http://deap.gel.ulaval.ca/doc/dev/tutorials/advanced/gp.html – user2514676

+0

Звучит как отдельный вопрос. Но да, используйте макет «dot» с помощью Graphviz. – Aric

3

Аргумент node_size принимает как скалярные, так и векторные значения. В то время как скаляр делает все узлы равных размеров, вектор помогает вам указать отдельные значения в списке, который будет использоваться для каждого узла. Если ваши идентификаторы узлов являются строками, то следующая стратегия работает достаточно хорошо.

Просто измените аргумент размера на список в networkx.draw_networkx_nodes на основе длины каждого идентификатора узла. Выберите a_base_size соответствующим образом.

networkx.draw_networkx_nodes (график, поз, node_size = [LEN (v) * the_base_size для V в graph.nodes()], node_color = "ш")

Вы можете приспособить это к случаю, когда вам также может обрабатывать метки.

*** Тем не менее, я не уверен, что индивидуальная корреспонденция будет сохранена при выборе размеров узлов из списка на основе размеров этикеток. Поделитесь своими результатами. Я лично использовал его для идентификаторов строковых узлов, и он работает хорошо.

 Смежные вопросы

  • Нет связанных вопросов^_^