我正在努力制作我想要的图表。我使用我的模型创建了一个networkx
图形,并使用graphviz_layout
获取节点的分层显示。我成功地按照自己的意愿对节点进行了彩色编码,但有几件事情我无法实现:
- 我希望图是水平的,使得节点0在左边作为起点。
- 我想要修改箭头的长度(将其缩小)。
- 我想要在所有具有相互连接边的节点之间添加箭头,例如节点3和5、5和7、7和8等。(我检查过G.edges(),它们存在,但不会显示)
这是我的代码...
from networkx.drawing.nx_agraph import write_dot, graphviz_layout
G = model.block_tree.tree
write_dot(G,'test.dot')
pos = graphviz_layout(G, prog='dot', root=0)
plt.title("Some title")
nx.draw_networkx_nodes(G, pos, node_color=color_vector, node_shape='s', node_size=500)
nx.draw_networkx_edges(G, pos)
nx.draw_networkx_labels(G, pos, font_size=10, font_color="white")
plt.show()
这就是我得到的内容...
![enter image description here](https://istack.dev59.com/kNHNQ.webp)
编辑1: 感谢评论,现在我所有正确节点之间都有箭头了。原来节点太大并且重叠了。现在它看起来像这样:
![enter image description here](https://istack.dev59.com/TNPSJ.webp)
如果有人知道如何使它变为水平,并以某种方式调整箭头长度,我仍然希望得到帮助...
编辑2: 我现在已经成功地让它正常工作了。我通过调整图形大小来缩小箭头长度(不是理想的解决方案,但完成了工作...)。我设法让水平翻转正常工作,发现
root
与传递给graphviz_lazout函数的额外参数之间存在冲突。我使用了这份文档来进行操作。请参见下面的代码:def blocktree_plot(model):
honest_blocks = []
selfish_blocks = []
for block in model.block_tree.tree.nodes():
if model.block_tree[block]["miner_is_selfish"] == True:
selfish_blocks.append(model.block_tree[block]["id"])
else:
honest_blocks.append(model.block_tree[block]["id"])
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(6, 2), sharex=True, sharey=True)
G = model.block_tree.tree
H = G.reverse(copy=True)
pos = graphviz_layout(H, prog='dot', args='-Grankdir="RL"')
plt.title(r"Blockchain with Selfish Mining ($\alpha$ = {})".format(alpha))
nx.draw_networkx_nodes(H,pos=pos, nodelist=honest_blocks, node_color='green', label="Honest miner", node_shape='s', node_size=200)
nx.draw_networkx_nodes(H,pos=pos, nodelist=selfish_blocks, node_color='red', label="Selfish miner", node_shape='s', node_size=200)
nx.draw_networkx_nodes(H,pos=pos, nodelist=[0], node_color='blue', label="Genesis block", node_shape='s', node_size=200)
nx.draw_networkx_edges(H, pos, arrows=True)
nx.draw_networkx_labels(H, pos, font_size=10, font_color="white")
# plt.legend(labelspacing=0.8, fontsize=9, frameon=False, borderpad=0.1)
plt.show()