Jos*_*sen 22 python graph-visualization
我正在使用Python来模拟在有向图上发生的过程.我想制作一个这个过程的动画.
我遇到的问题是大多数Python图形可视化库将成对的有向边组合成一个边.例如,NetworkX在显示下图时只绘制两条边,而我想分别显示四条边的每一条:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.MultiDiGraph()
G.add_edges_from([
(1, 2),
(2, 3),
(3, 2),
(2, 1),
])
plt.figure(figsize=(8,8))
nx.draw(G)
Run Code Online (Sandbox Code Playgroud)

我想显示这样的东西,每个平行边缘分开绘制:

R中的igraph中的R倒数边缘的问题似乎处理相同的问题,但是解决方案存在于R igraph库,而不是Python.
有没有一种简单的方法可以使用现有的Python图形可视化库生成这种样式的绘图?如果它可以支持多图,那将是一个奖励.
我愿意接受调用外部程序来生成图像的解决方案.我想生成一系列动画帧,因此解决方案必须自动化.
Lau*_*ves 25
本的Graphviz工具似乎表现出明显不同的边缘.
例如,给出这个:
digraph G {
A -> B;
A -> B;
A -> B;
B -> C;
B -> A;
C -> B;
}
Run Code Online (Sandbox Code Playgroud)
以dot生产:

Graphviz的输入语言非常简单,所以你可以自己生成它,虽然搜索"python graphviz"确实会出现几个库,包括graphvizPyPI上的模块.
这是使用graphviz模块生成上图的python :
from graphviz import Digraph
dot = Digraph()
dot.node('A', 'A')
dot.node('B', 'B')
dot.node('C', 'C')
dot.edges(['AB', 'AB', 'AB', 'BC', 'BA', 'CB'])
print(dot.source)
dot.render(file_name, view=True)
Run Code Online (Sandbox Code Playgroud)
Ioa*_*dis 12
使用NetworkX,避免文件I/O并通过pydot使用dot进行布局的可能解决方法是:
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from io import BytesIO
g = nx.dodecahedral_graph()
d = nx.drawing.nx_pydot.to_pydot(g) # d is a pydot graph object, dot options can be easily set
# attributes get converted from networkx,
# use set methods to control dot attributes after creation
png_str = d.create_png()
sio = BytesIO() # file-like string, appropriate for imread below
sio.write(png_str)
sio.seek(0)
img = mpimg.imread(sio)
imgplot = plt.imshow(img)
Run Code Online (Sandbox Code Playgroud)
为什么seek(0)需要,请参阅如何在python中从字符串创建图像
如果在IPython(qt)控制台中,那么上面将打印内联,更直接的方法是:
import networkx as nx
from IPython.display import Image
g = nx.dodecahedral_graph()
d = nx.drawing.nx_pydot.to_pydot(g)
png_str = d.create_png()
Image(data=png_str)
Run Code Online (Sandbox Code Playgroud)
AMa*_*nto 11
也许我有点晚了,但我找到了另一个解决您问题的方法。我发布它是为了如果有人遇到同样的问题,它会有所帮助。
能够绘制向图与networkx使用matplotlib的方式,边缘单独出现,通过将参数connectionstyle的函数networkx.drawing.nx_pylab.draw:
import matplotlib.pyplot as plt
import networkx as nx
# create a directed multi-graph
G = nx.MultiDiGraph()
G.add_edges_from([
(1, 2),
(2, 3),
(3, 2),
(2, 1),
])
# plot the graph
plt.figure(figsize=(8,8))
nx.draw(G, connectionstyle='arc3, rad = 0.1')
plt.show() # pause before exiting
Run Code Online (Sandbox Code Playgroud)
结果如下:

另请参阅about the argument的文档matplotlib.patches.ConnectionStyleconnectionstyle。
| 归档时间: |
|
| 查看次数: |
24087 次 |
| 最近记录: |