我想在下图中添加一个将 beta 链接到 beta 的边:

使用 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 下。

最佳答案

如果您查看第 301 行(Edge 类)中的源代码 here,您将看到所有线均由基于坐标 ([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 ,以下文档显示了 self loops 的使用。或者,您可以在 DAFT Github 上提出问题。

关于python - 使用 Python 的 `daft` 库在图形中添加自边,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24713691/

10-12 17:53
查看更多