Networkx:Drawing
Graph Layout
bipartite_layout二分图
bipartite_layout(G, nodes, align=‘vertical’, scale=1, center=None, aspect_ratio=1.3333333333333333)
将节点放在两条直线中
G:Networkx或者节点列表
node:放在左边或上边的节点列表
align:vertical或者horizontal
scale:位置的缩放因子
center:布局的中心坐标对。
aspect_ratio:布局宽度与高度的比率。
G = nx.bipartite.gnmk_random_graph(3, 5, 10, seed=123)
top = nx.bipartite.sets(G)[0]
pos = nx.bipartite_layout(G, top)
nx.draw(G, pos)
plt.show()

pos = nx.bipartite_layout(G, top, align='horizontal')

circular_layout
circular_layout(G, scale=1, center=None, dim=-2)
参数:
G:Networkx或者节点列表
scale:位置的缩放因子
center:布局的中心坐标对。
dim:布局的维数,如果大于2,多余的位数设置为0,如果小于2,会产生一个值错误。
G = nx.path_graph(10)
pos = nx.circular_layout(G)
nx.draw(G, pos)
plt.show()

kamada_kawai_layout
Kamada, T. and Kawai, S.: An Algorithm for Drawing General Undirected Graphs. Information Processing Letters, 31/1, 7–15, 1989.
图结构包含多种结构,树结构、完全图,所以很难找到一个共同准则,但有两个要求是公认的,一是减少边交叉的数量,另一个是均匀分布边和节点。
但是,边交叉数量的减少并不意味着是一个更好的准则,比如下图,a是一个更好的图数据结构,尽管它有5个交叉,b为了边交叉的减少牺牲了对车性。

所以第二个条件(布局的总体平衡)更加重要,在这个布局中,总体平衡被公式化为所有顶点对的理想距离与实际距离之间的平方和。
弹簧系统
将节点的平衡布局与动态平衡的弹簧系统相关联,所以不平衡度可以用弹簧的总体能量来表示
l
i
j
l_{ij}
lij是节点
p
i
p_i
pi和节点
p
j
p_j
pj之间的原始距离,
d
i
j
d_{ij}
dij是
v
i
v_i
vi和
v
j
v_j
vj之间的最短路径,所以

其中L是一条边的期望距离。可以通过图半径去决定L

L_0是显示矩形区域边的长度。
k
i
j
k_{ij}
kij是
p
i
p_i
pi和
p
j
p_j
pj的力量,其中K是常数。


对这个式子进行局部最小优化。
kamada_kawai_layout(G, dist=None, pos=None, weight=‘weight’, scale=1, center=None, dim=2)
参数:
G:Networkx或者节点列表
dist:一个两层字典,记录节点之间的最优距离,如果None,就使用最短路径长度
pos:节点的初始位置,如果为空,如果维数大于2,用circular_layout(),如果维数等于1,就使用线性layout
weight:持有边权重的边属性,如果为空,所有的边权重为1
scale:位置的缩放因子
center:布局的中心坐标对。
dim:layout的维度
G = nx.path_graph(4)
pos = nx.kamada_kawai_layout(G)

G = nx.complete_graph(5)
pos = nx.kamada_kawai_layout(G)
nx.draw(G, pos=pos) # Draw the original graph
# Draw a subgraph, reusing the same node positions
nx.draw(G.subgraph([0, 1, 2]), pos=pos, node_color="red")
plt.show()

planar_layout
planar_layout(G, scale=1, center=None, dim=2)
没有边交叉地布置节点
G = nx.path_graph(4)
pos = nx.planar_layout(G)

random_layout
random_layout(G, center=None, dim=2, seed=None)
把节点均匀随机放在单位正方形中,就是一个边长为1的正方形
G = nx.lollipop_graph(4, 3)
pos = nx.random_layout(G)

rescale_layout和rescale_layout_dict
rescale_layout(pos, scale=1)
将位置数组缩放到所有轴上的范围 (-scale, scale)。
import numpy as np
pos = {0: np.array((0, 0)), 1: np.array((1, 1)), 2: np.array((0.5, 0.5))}
nx.rescale_layout_dict(pos)
{0: array([-1., -1.]), 1: array([1., 1.]), 2: array([0., 0.])}
pos = {0: np.array((0, 0)), 1: np.array((-1, 1)), 2: np.array((-0.5, 0.5))}
nx.rescale_layout_dict(pos, scale=2)
{0: array([ 2., -2.]), 1: array([-2., 2.]), 2: array([0., 0.])}
shell_layout
将节点分布在同心圆上
shell_layout(G, nlist=None, rotate=None, scale=1, center=None, dim=2)
参数:
G:Networkx或者节点列表
nlist:list of lists 每个shell的节点列表
rotate:相对于前一个"shell"的起始位置,用于旋转每个"shell"的起始位置的角度。
scale:位置的缩放因子
center:布局的中心坐标对。
dim:layout的维度,只能为2
G = nx.path_graph(7)
shells = [[0, 1], [2, 3, 4, 5, 6]]
pos = nx.shell_layout(G, shells)

spring_layout
使用 Fruchterman-Reingold 力导向算法排列节点。
spring_layout(G, k=None, pos=None, fixed=None, iterations=50, threshold=0.0001, weight=‘weight’, scale=1, center=None, dim=2, seed=None)
参数:
G:Networkx或者节点列表
k:节点之间的最优距离,如果空,就设置为1/sqrt(n),其中n四节点数量
pos:节点的初始位置,如果为空,使用随机位置
fixed:需要固定在初始位置的节点
iterations:最大迭代次数
threshhold:当相对错误小于thedhold时候,迭代停止。
weight:持有边权重的边属性,如果为空,所有的边权重为1
scale:位置的缩放因子
center:布局的中心坐标对。
dim:layout的维度
seed:随机种子
G = nx.path_graph(4)
pos = nx.spring_layout(G)
spectral_layout
使用图拉普拉斯矩阵的特征向量排列节点。
使用未归一化的拉普拉斯矩阵,该布局显示节点的可能聚类,这是切割比的近似值。如果 dim 是维度的数量,那么位置是与从第二个开始的升序特征值对应的 dim 个特征向量的分量。
spectral_layout(G, weight=‘weight’, scale=1, center=None, dim=2)
参数:
G:Networkx或者节点列表
weight:持有边权重的边属性,如果为空,所有的边权重为1
scale:位置的缩放因子
center:布局的中心坐标对。
dim:layout的维度
G = nx.path_graph(4)
pos = nx.spectral_layout(G)

spiral_layout
螺旋形布局
spiral_layout(G, scale=1, center=None, dim=2, resolution=0.35, equidistant=False)
参数:
G:Networkx或者节点列表
weight:持有边权重的边属性,如果为空,所有的边权重为1
scale:位置的缩放因子
center:布局的中心坐标对。
dim:layout的维度
resolution:螺旋布局的紧凑性。数值较低会导致更加紧凑的螺旋布局
equidistant:如果为真,节点将按照从中心向外减小的角度等距定位。如果为假,节点将按照从中心向外增加的间距等角度定位。
G = nx.path_graph(50)
pos = nx.spiral_layout(G)

multipartite_layout
multipartite_layout(G, subset_key=‘subset’, align=‘vertical’, scale=1, center=None)
G:Networkx或者节点列表
subset_key:用作层次子集的节点数据的键。
align:vertical或者horizontal
scale:位置的缩放因子
center:布局的中心坐标对。
G = nx.complete_multipartite_graph(28, 16, 10)
pos = nx.multipartite_layout(G)

文章介绍了Networkx库中的各种图形布局方法,包括bipartite_layout用于二分图布局,circular_layout用于环形布局,Kamada-Kawai布局注重减少边交叉和整体平衡,spring_layout采用力导向算法,spectral_layout基于图拉普拉斯矩阵,spiral_layout为螺旋形布局,以及multipartite_layout处理multipartite图。
1088

被折叠的 条评论
为什么被折叠?



