Python: networkx: как сделать размер узла автоматически расширяющимся, чтобы соответствовать метке
Я использую этот бит кода из задачи deap symbolic regression example, и график отображается нормально, но я хочу, чтобы узлы расширялись как закругленные прямоугольники, чтобы соответствовать тексту автоматически. (Я не хочу просто указывать размер узла методом проб и ошибок). Как бы я это сделал?
# 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()
2 ответов:
Нет простого способа сделать это с matplotlib и networkx (конечно, это возможно с достаточным количеством кода). Graphviz делает действительно отличную работу с метками, и легко писать файлы формата dot из networkx для обработки с помощью Graphviz.
Также взгляните на https://github.com/chebee7i/nxpd который может сделать именно то, что вам нужно.
Аргумент node_size принимает как скалярные, так и векторные значения. В то время как скаляр делает все узлы одинакового размера, вектор помогает указать индивидуальные значения в списке, который будет использоваться для каждого узла. Если ваши идентификаторы узлов являются строками, то следующая стратегия работает довольно хорошо.
Просто измените аргумент size на список в networkx.draw_networkx_nodes на основе длины каждого идентификатора узла. Выберите the_base_size соответствующим образом.
Networkx.draw_networkx_nodes(график, поз, node_size=[лен(в) * the_base_size для v в графике.nodes ()], node_color= "w")
Вы можете адаптировать это к случаю, когда вы также можете обрабатывать метки.
***однако я не уверен, сохранится ли взаимно однозначное соответствие, пока он выбирает размеры узлов из списка на основе размеров меток. Поделитесь своими результатами. Я лично использовал его для идентификаторов строковых узлов, и он хорошо работает.
Comments