我有一个表示有向图的数据结构,我想在HTML页面上动态呈现它.这些图通常只是几个节点,可能只有十个节点,所以我的猜测是性能不会是一个大问题.理想情况下,我希望能够使用jQuery将其挂钩,以便用户可以通过拖动节点来手动调整布局.
注意:我不是在寻找图表库.
我正在尝试绘制运行脚本的任何网络的图形。我使用scapy收集数据包,并希望每台计算机通信有一个节点,每个连接有一个边缘。
问题是我找不到在屏幕上足够形象地显示图形的方法。到目前为止,将networkx与matlib.pyplot结合使用可带来最佳结果,但看起来仍然相当随机且混乱,标签难以读取,节点相互重叠,等等。最好还具有与图进行交互的能力-移动节点,将鼠标悬停在节点/边上以获得更多信息,放大或什至将节点群集在一起,以便在单击群集时可以看到由哪些节点组成集群。
由于分析网络数据并向图中添加节点和边将很麻烦,因此我在这里仅添加相关部分(实际上显示了我构建的图的部分):
pos = nx.spring_layout(Graph, scale=2)
edge_labels = nx.get_edge_attributes(Graph, "Protocol")
nx.draw(Graph,pos, with_labels=True, node_size=600, font_size=8, font_weight='bold')
nx.draw_networkx_edge_labels(Graph, pos, edge_labels=edge_labels, font_size=8)
plt.show()
Run Code Online (Sandbox Code Playgroud)
(我将网络导入为nx,将matplotlib.pyplot导入为plt)
我还尝试了graphviz,plotty和bokeh,但无法真正使它们正常工作,在对Google进行故障排除后,我觉得无论如何他们都无法解决我的问题,我还尝试了AdjustText-但我无法设法使其适应我的需求代码以任何方式(找不到如何获取图形的text属性)和Holoviews-但是无论我尝试什么(即使我从其站点复制并粘贴示例),它都拒绝显示图像-任一python都表示'%opts ...'是无效的语法,或者如果我尝试以其他方式更改选项,则代码将一直运行直到结束并且在屏幕上不显示任何内容。
我在网上找到了很多局部解决方案,所以它们都不起作用,有人有全面的解决方案吗?
为了构建有向网络图,Plotly 目前的做法似乎是使用注解。当边缘很少并且可以通过图形布局手动填充每个边缘时,此方法有效,例如,此示例。
但是,如果我要创建一个更复杂的图形,是否有一种好方法可以迭代地定义所有边的箭头坐标(我只能考虑构造一个字符串然后使用eval(),尽管我知道这是不好的做法)?(编辑:似乎这种连接迭代生成的dict()定义字符串的方法不起作用——仅适用于一个dict()定义)
编辑:添加代码片段以更好地说明场景(eval()注释掉该行以进行比较):
import plotly.offline as py
import plotly.graph_objs as go
trace = go.Scatter(
x=[1, 2, 2, 1],
y=[3, 4, 3, 4],
mode='markers',
marker=dict(size=[100, 100, 100, 100])
)
fig = go.Figure(
data=[trace],
layout=go.Layout(
annotations = [
dict(
ax=1, ay=3, axref='x', ayref='y',
x=2, y=4, xref='x', yref='y'
),
# eval("dict(ax=2, ay=3, axref='x', ayref='y', x=1, y=4, xref='x', yref='y')")
]
)
)
py.plot(fig)
Run Code Online (Sandbox Code Playgroud)
我也愿意尝试其他可视化包,如果在 Bokeh 或其他人下有这样做的好方法。
python ×3
networkx ×2
graph ×1
graph-layout ×1
holoviews ×1
javascript ×1
jquery ×1
jung ×1
piccolo ×1
plotly ×1