python - Networkx中大型网络的可视化问题
问题描述
我有一个大型 Python 数据框,我正在尝试从中构建网络。我有一个source_node
(大约有 10 个唯一值)和一个 target_node(有数千个值)。我正在研究例如source_node_1
到多个目标节点的传出交互。目前,至少可以说,我对网络的可视化并不理想。
结果如下所示:
这是用于创建网络的代码:
df = pd.DataFrame({
'source_node':['sc1','sc2','sc2'],
'target_node':['tg1,tg2,tg3','tg10','tg2,sc1']
})
df['splitted_targets'] = df['target_node'].apply(lambda x: x.split(','))
G = nx.DiGraph()
for r in df.iterrows():
for user in r[1]['splitted_targets']:
G.add_edge(r[1]['source_node'], user)
nx.draw(G, with_labels=True)
有没有一种简单的方法可以为每个唯一的source_node
和它的创建 10 个图形target_nodes
,或者创建一个可以读取的简化图形?
解决方案
如此巨大的图表看起来像一个可怕的混乱是合乎逻辑的。在每个节点有 5000 个节点的全高清显示器上,一个节点不超过:
sqrt(1920 * 1080 / 5000) = 20
用于节点、文本标签和所有可能边缘的 20x20 像素的图像。而且,人脑对这么多数据的处理能力很差,即使画出巨大的图表,也无法正确分析。
在您的情况下,您的源节点数量很少,每个源节点都有数千个目标节点。如果您只删除仅链接到一个源节点的所有目标节点,则可以大大减小图形的大小(请记住,您仍然拥有此信息,您可以稍后通过打印与特定源对应的所有目标节点来分析它节点):
G.remove_nodes_from([
n
for n in G.nodes
if n not in df['source_node']
if G.degree(n) < 2
])
所以最终的代码将是:
df = pd.DataFrame({
'source_node':['sc1','sc2','sc3'],
'target_node':['tg1,tg2,tg3,sc2','tg10,tg2,sc3','tg2,sc1'] })
df['splitted_targets'] = df['target_node'].apply(lambda x: x.split(','))
G = nx.DiGraph()
for r in df.iterrows():
for user in r[1]['splitted_targets']:
G.add_edge(r[1]['source_node'], user)
print(list(list(G.neighbors(n)) for n in G.nodes))
G.remove_nodes_from([
n
for n in G.nodes
if n not in df['source_node']
if G.degree(n) < 2
])
nx.draw(G, with_labels=True)
而这张图:
将减少为:
我相信在你的情况下它会有很大帮助,因为你只有几十个源节点。您还可以使用节点大小、节点标签、字体等。
推荐阅读
- python - 带有lambda的python tkinter菜单没有选择正确的选项
- api - Actix 请求错误,特性 `std::future::Future` 未针对 `Request<()>` 实现
- reactjs - 需要刷新页面才能注销
- fullcalendar-3 - FullCalendar v3 fc 轴首先调整
- reactjs - 在 react-dates 中呈现一个月中特定日期的一些详细信息
- c++ - 如何让 QIconEngine 可以访问 QPalette?
- azure-devops - 如何对 mailSettings 文件执行 XML 变量替换?
- sql - 获取SQL中两个日期之间的天数
- sql - HIVE 数据透视和总和/计数
- ruby-on-rails - 使用 Ruby on Rails 从数据库中获取图像文件并显示到 Rails 网站