我想使用pymnet可视化多层网络。包的documentation中的示例显示了如何绘制多层网络(如下图的左侧),但我想添加另一个层(橙色),该层的显示方式与蓝色层相似。我知道如何添加另一层,但是它将在蓝色层之上。我需要的是当前图旁边的一层。

原始图可以使用以下方法创建:

from pymnet import *
fig=draw(er(10,3*[0.4]),layout="spring")

这就是我想要得到的:

python - 在Pymnet中修改多层网络图-LMLPHP

有没有办法在Pymnet中实现它?如果没有,是否还有其他软件包可以绘制此图?

最佳答案

这是一个仅使用networkx创建多层图并自行计算节点位置的解决方案。

为了便于说明,我们随机创建了一个30个节点的小图。

图层是具有其他属性的子图:(x,y)坐标和颜色。
坐标用于在2D网格中相对定位图层。

import networkx as nx

# create a random graph of 30 nodes
graph = nx.fast_gnp_random_graph(30, .2, seed=2019)

# Layers have coordinates and colors
layers = [
    (nx.Graph(), (0, 0), "#ffaaaa"),
    (nx.Graph(), (0, 1), "#aaffaa"),
    (nx.Graph(), (0, 2), "#aaaaff"),
    (nx.Graph(), (1, 2), "#ffa500"),
]

每层都填充有主图的节点。
在这里,我们决定将节点列表划分为不同的范围(图中节点的开始和结束索引)。

每个节点的颜色存储在color_map中。
稍后在图形绘制期间使用此变量。

import itertools

# node ranges in the graph
ranges = [(0, 6), (6, 15), (15, 20), (20, 30)]

# fill the layers with nodes from the graph
# prepare the color map
color_map = []
for (layer, coord, color), (start, end) in zip(layers, ranges):
    layer.add_nodes_from(itertools.islice(graph.nodes, start, end))
    color_map.extend([color for _ in range(start, end)])

然后,我们可以计算每个节点的位置。
节点位置根据层坐标移动。

# Calculate and move the nodes position
all_pos = {}
for layer, (sx, sy), color in layers:
    pos = nx.circular_layout(layer, scale=2)  # or spring_layout...
    for node in pos:
        all_pos[node] = pos[node]
        all_pos[node] += (10 * sx, 10 * sy)

现在,我们可以绘制图形:

import matplotlib.pyplot as plt

# Draw and display the graph
nx.draw(graph, all_pos, node_size=500, node_color=color_map, with_labels=True)
plt.show()

结果看起来像这样:

python - 在Pymnet中修改多层网络图-LMLPHP

当然,您可以使用3D网格并使用投影来获得类似3D的预览。

关于python - 在Pymnet中修改多层网络图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57378631/

10-09 15:22