我想在下图中添加一个将 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/