使用Python的`daft`库在图形绘制中添加自环。

3

我想在以下绘图中添加一个连接beta到beta的边缘:

enter image description here

使用DAFT生成了以下代码:

from matplotlib import rc
rc("font", family="serif", size=12)
rc("text", usetex=True)
import daft

pgm = daft.PGM([2.3, 3.05], origin=[0.3, 0.3], observed_style="inner")

# Hierarchical parameters.
pgm.add_node(daft.Node("beta", r"$\beta$", 1.5, 2))

# Latent variable.
pgm.add_node(daft.Node("w", r"$w_n$", 1, 1))

# Data.
pgm.add_node(daft.Node("x", r"$x_n$", 2, 1, observed=True))

# Add in the edges.
pgm.add_edge("beta", "beta")  # Attempting to create a self-edge, but no effect!
pgm.add_edge("w", "x")
pgm.add_edge("w", "w")
pgm.add_edge("w", "beta")
pgm.add_edge("beta", "x")

# Render and save.
pgm.render()
pgm.figure.savefig("nogray.pdf")

为什么它不起作用?特别是这行代码 pgm.add_edge("beta", "beta")。 除了 Daft,只要是 Python 下的就可以提供其他建议。


抱歉,我更新了缺失的'matplotlib'头文件的代码。 - neversaint
1个回答

4
如果您查看源代码此处,从第301行开始(即Edge类),你会发现所有的线都是基于坐标([x, x + dx], [y, y + dy])沿着直线给出的,下面是一个无向边的代码示例:
x, y, dx, dy = self._get_coords(ctx)

# Plot the line.
line = ax.plot([x, x + dx], [y, y + dy], **p)
return line 

因此,似乎没有办法定义自环(因为这样的边缘需要弯曲以便弯回到同一节点)。

关于替代库,您可以看看 networkx,以下文档展示了其与自环的使用。或者您可以在DAFT Github上提出问题。


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