我编写了一个代码,将我的MultiDiGraph()
转换为pydot
图表以显示自我循环和箭头但转换后,pydot
图A
已丢失所有属性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)
答案 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_pydot
,networkx == 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')
与设置节点大小相关的属性为height
,width
和fixedsize
。来自GraphViz' documentation:
height
节点高度,以英寸为单位。这被视为节点的初始最小高度。如果fixedsize为true,则这将是节点的最终高度。否则,如果节点标签需要更多高度,则节点的高度将增加以包含标签。另请注意,如果输出格式为点,则赋予高度的值将为最终值。
如果节点形状是规则的,则宽度和高度相同。在这种情况下,如果明确设置宽度或高度,则使用该值。在这种情况下,如果明确设置宽度或高度,则使用两个值中的最大值。如果两者都未明确设置,则使用两个默认值中的最小值。
上述结果使用了networkx == 2.0
和pydot == 1.2.3
。