是否可以更改pydot图的节点大小?

时间:2017-11-05 18:01:59

标签: python directed-graph pydot digraphs

我编写了一个代码,将我的MultiDiGraph()转换为pydot图表以显示自我循环和箭头但转换后,pydotA已丢失所有属性G。如何更改图A的节点大小并将其设置为node_sizes[]列表中的对应值,就像我为G所做的那样?

def draw_graph(graph, size):

    # extract nodes from graph
    nodes = set([n1 for n1, n2 in graph] + [n2 for n1, n2 in graph])
    print("Nodes ",nodes,"\n")

    node_sizes = []

    for n in nodes:
        #Scaling up the node importance by a factor of 2000 to make it visible
        node_sizes.append( size[n] * 2000)

    print("Node size ",node_sizes,"\n")

    # create networkx graph
    G=nx.MultiDiGraph()

    G.add_edges_from(edges)
    G.add_nodes_from(nodes)

    edge_colours = ['black' for edge in G.edges()]

    pos = nx.spring_layout(G)
    nx.draw_networkx_nodes(G, pos, cmap=plt.get_cmap('jet'), node_size = node_sizes)
    nx.draw_networkx_labels(G, pos)
    nx.draw_networkx_edges(G, pos, edge_color='black', arrows=True)

    plt.show()

    # render pydot by calling dot, no file saved to disk
    A=nx.to_pydot(G, strict=True)

    png_str = A.create_png(prog='dot')

    # treat the dot output string as an image file
    sio = BytesIO()
    sio.write(png_str)
    sio.seek(0)
    img = mpimg.imread(sio)

    # plot the image
    imgplot = plt.imshow(img, aspect='equal')
    plt.show(block=False)

1 个答案:

答案 0 :(得分:1)

networkx使用标有networkx.MultiDiGraph个节点和边的属性设置转换期间节点和边的点属性。例如,g.add_node(1, label='first node')设置label属性:

import networkx as nx

h = nx.MultiDiGraph()
h.add_node(1, label='first node')
p = nx.drawing.nx_pydot.to_pydot(h)
>>> p.to_string()
'digraph  {\n1 [label="first node"];\n}\n'

(另外:调用函数nx.drawing.nx_pydot.to_pydot而不是nx.to_pydotnetworkx == 2.0不存在。{/ p>

使用此原则,设置节点的height属性(或width,详见下文),我们可以在绘制时更改节点的大小:

import networkx as nx

# create a `networkx` graph
g = nx.MultiDiGraph()
g.add_edge(1, 2)
g.add_node(3, height=3)
g.add_node(4, height=6)
# convert to a `pydot` graph
p = nx.drawing.nx_pydot.to_pydot(g)
p.write_png('foo.png', prog='dot')

如果您想编写自己的转换器(而不是调用networkx.drawing.nx_pydot.to_pydot),请直接使用pydot图表:

import pydot

p = pydot.Dot()
# create one node
nd = pydot.Node("a")
nd.set_height('"4"')
p.add_node(nd)
# create another node
nd = pydot.Node("b")
nd.set_height('"2"')
p.add_node(nd)
print(p.to_string())
p.write_png('bar.png')

与设置节点大小相关的属性为heightwidthfixedsize。来自GraphViz' documentation

  

height

     

节点高度,以英寸为单位。这被视为节点的初始最小高度。如果fixedsize为true,则这将是节点的最终高度。否则,如果节点标签需要更多高度,则节点的高度将增加以包含标签。另请注意,如果输出格式为点,则赋予高度的值将为最终值。

     

如果节点形状是规则的,则宽度和高度相同。在这种情况下,如果明确设置宽度或高度,则使用该值。在这种情况下,如果明确设置宽度或高度,则使用两个值中的最大值。如果两者都未明确设置,则使用两个默认值中的最小值。

上述结果使用了networkx == 2.0pydot == 1.2.3

相关问题