在pymnet中修改多层网络图
Modifying a multilayer network plot in pymnet
我想使用多层网络可视化 pymnet. The example in the package's documentation 展示了如何绘制多层网络(下图的左侧),但我想添加另一层(orange ) 将以与 blue 层类似的级别显示。我知道如何添加另一层,但它会在 blue 层之上。我需要的是我当前绘图旁边的图层。
可以使用以下方法创建原始图:
from pymnet import *
fig=draw(er(10,3*[0.4]),layout="spring")
这是我想要得到的:
有没有办法在pymnet中实现?如果没有,是否有其他包可以绘制此图?
这是一个解决方案,您只使用 networkx 创建您的 multi-layer 图表,并自行计算节点位置。
为了便于解释,我们随机创建了一个包含 30 个节点的小图。
图层 sub-graphs 具有附加属性:(x, y) 坐标和颜色。
坐标用于在二维网格中相对定位图层。
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()
结果如下所示:
当然,您可以使用 3D 网格并使用投影来获得类似 3D 的预览。
我想使用多层网络可视化 pymnet. The example in the package's documentation 展示了如何绘制多层网络(下图的左侧),但我想添加另一层(orange ) 将以与 blue 层类似的级别显示。我知道如何添加另一层,但它会在 blue 层之上。我需要的是我当前绘图旁边的图层。
可以使用以下方法创建原始图:
from pymnet import *
fig=draw(er(10,3*[0.4]),layout="spring")
这是我想要得到的:
有没有办法在pymnet中实现?如果没有,是否有其他包可以绘制此图?
这是一个解决方案,您只使用 networkx 创建您的 multi-layer 图表,并自行计算节点位置。
为了便于解释,我们随机创建了一个包含 30 个节点的小图。
图层 sub-graphs 具有附加属性:(x, y) 坐标和颜色。 坐标用于在二维网格中相对定位图层。
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()
结果如下所示:
当然,您可以使用 3D 网格并使用投影来获得类似 3D 的预览。