NetworkX:如何使用TeX符号绘制标签节点/边缘?

3
非常简单,我正在尝试绘制一个简单的状态机,如下所示:

enter image description here

我愿意接受任何形式的绘图,只要它允许围绕这样的图形进行灵活性。

到目前为止,这是我所拥有的内容:

import networkx as nx
from nxpd import draw
G = nx.MultiDiGraph(with_labels=False,rankdir='LR')
G.graph['dpi'] = 120
G.add_node(1,label=r"$\sigma_1$",shape = 'circle')
G.add_node(2,label=r"$\sigma_2$",shape = 'circle')
G.add_edge(1,1,headport='nw',tailport='sw',label='sp')
G.add_edge(2,2,headport='se',tailport='ne')
G.add_edge(1,2,label='1-sp')
draw(G, show='ipynb')

我要做的事情与这显然相去甚远。
有几件事情没有起作用:
- headport='nw',tailport='sw' 做了一些奇怪的事情 - 显然,r"$\sigma_2$" 没有输出所需的基于TeX的符号。
如何绘制类似上面的图形?
- 使用matplotlib无法允许自环 尝试使用matplotlib和networkx实现相同的目标
import matplotlib.pyplot as plt
import networkx as nx

%matplotlib inline

G=nx.MultiDiGraph()
pos = {0:(100,100),1:(0,0)}
G.add_node(0)
G.add_node(1)
G.add_edge(0,0)
G.add_edge(0,1)
G.add_edge(1,0)

labels={}
labels[0]=r'$\sigma_1$'
labels[1]=r'$\sigma_2$'
nx.draw_networkx_labels(G,pos,labels)
plt.axis('off')
plt.show() # display

哪些原因导致输出空白屏幕?
1个回答

1

我不熟悉 nxpd(并且 import nxpd 在我的电脑上无法工作),因此我使用 nx 命令。

import networkx as nx
G = nx.MultiDiGraph(with_labels=False,rankdir='LR')
G.graph['dpi'] = 120
G.add_node(1,label=r"$\sigma_1$",shape = 'circle')
G.add_node(2,label=r"$\sigma_2$",shape = 'circle')
G.add_edge(1,1,headport='nw',tailport='sw',label='sp')
G.add_edge(2,2,headport='se',tailport='ne')
G.add_edge(1,2,label='1-sp')
labels = {node:G.node[node]['label'] for node in G.nodes()}
nx.draw(G, with_labels=True, labels=labels)

import pylab
pylab.savefig('tmp.png')

enter image description here

(注:这里没有显示自环,但我认为你知道如何修复。)
我认为你的最后一段代码输出空白屏幕的原因是因为这个已知的 bug(不是 networkx 的问题)pylab/networkx; no node labels displayed after update。如果你保存图形,标签就会出现。

1
嗨,感谢您的回复。我还没有将其标记为答案,因为您提供的代码与我试图模仿的图形相去甚远(请参见顶部)。 - tmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接