# Python层内层外多图布局图基分析

{% embed url="https://viadean.notion.site/Python-9729844f3a9b43cda51429d7682bb80a" %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}

### 🎯要点

🎯多层图和多路复用图结构模型 | 🎯图结构变换、读写图、聚类系数、可视化、同构、图基分析 | 🎯稀疏网络边数和节点数线性扩展 | 🎯耦合边的生成和惰性评估 | 🎯层内布局计算、多层网络绘图、层间边绘制，嵌入的网络布局、降低嵌入维数、动态多路复用网络可视化、异构网络分解

### 📜复杂网络用例

📜[Python药物副作用生物图分析算法和矩阵降维算法](python-yao-wu-fu-zuo-yong-sheng-wu-tu-fen-xi-suan-fa-he-ju-zhen-jiang-wei-suan-fa)

📜[Python鲁汶意外莱顿复杂图拓扑分解算法](python-lu-wen-yi-wai-lai-dun-fu-za-tu-tuo-pu-fen-jie-suan-fa)

📜[Python和MATLAB网络尺度结构和幂律度大型图生成式模型算法](python-he-matlab-wang-luo-chi-du-jie-gou-he-mildu-da-xing-tu-sheng-cheng-shi-mo-xing-suan-fa)

### 🍪语言内容分比

{% @mermaid/diagram content="pie title 语言分比
 "Python":90
 "C":30
 "C++":20
 "Java":20" %}

{% @mermaid/diagram content="pie title 内容分比
 "图论":90
 "数学":70
 "概率":40
 "图形分析":50
 "网络理论":60
 "算法":40" %}

### 🍇Python和Java可视化连续图形布局算法

此连续图形布局算法是一种力导向布局：它模拟物理系统，以便将网络空间化。节点像带电粒子一样相互排斥，而边缘像弹簧一样吸引其节点。这些力会产生一种运动，最终达到平衡状态。

力导向绘图具有根据其他节点放置每个节点的特殊性。此过程仅取决于节点之间的连接。从不考虑节点的最终属性。这种策略有其缺点。结果取决于初始状态。该过程可能会陷入局部最小值。它不是确定性的，每个点的坐标不反映任何特定变量。结果不能读作笛卡尔投影。节点的位置不能单独解释，必须与其他节点进行比较。尽管存在这些问题，但该技术的优势在于允许对结构进行视觉解释。它的本质是将结构近似性转化为视觉近似性，从而促进分析，特别是社交网络分析。力导向布局产生的视觉密度表示结构密度。其他类型的布局允许对结构进行视觉解释，例如确定性布局“蜂巢图”，但它们不描绘结构的模块化方面。

每个力导向算法都依赖于特定的吸引力公式和特定的排斥力公式。 “弹簧电动”布局是受现实生活启发的模拟。它使用带电粒子的斥力公式$$\left(F_r=k / d^2\right)$$和弹簧的吸引力公式$$\left(F_a=-k \cdot d\right)$$，涉及几何距离两个节点之间的 d。 Fruchterman 和 Rheingold 使用自定义力创建了一种高效算法（吸引力 $$F_a=d^2 / k$$ 和斥力 $$F_r=-k^2 / d$$，其中$$k$$ 调整网络的缩放比例）。请注意，实际上，从一开始就使用了非现实力，尤其是 Eades 在他的先驱算法中。 Fruchterman 和 Rheingold 受到 Eades 工作的启发，他们注意到尽管使用弹簧比喻来解释他的算法，但吸引力并不是弹簧的力量。

十六年后，Noack 解释说，力导向算法之间最重要的区别是距离在图空间化中所扮演的角色。在物理系统中，力取决于相互作用的实体之间的距离：较远的实体比较近的实体吸引较少，排斥较多，反之亦然。距离和力之间的相互依赖性可以是线性的、指数的或对数的。例如，弹簧模型精确地复制了激发它的物理力，从而建立了距离和力之间的线性比例（对于弹簧吸引力）以及距离和力之间的平方比例，对于电磁力排斥力。Noack将布局的能量模型或“（吸引，斥力）模型”定义为用于计算吸引力和斥力的公式中距离所取的指数（$$\log$$ 被视为 $$0^{\text {th }}$$ 功率）。例如，弹簧电动布局的模型为(1,-2)。

Python伪码实现算法

```python
 import networkx as nx
 import matplotlib.pyplot as plt
 from fx import Fax
 import numpy as np
```

```python
 fax = Fax(
                           outboundAttractionDistribution=True, 
                           linLogMode=False,  
                           adjustSizes=False,  
                           edgeWeightInfluence=1.0,
 ​
                           jitterTolerance=1.0,  
                           barnesHutOptimize=True,
                           barnesHutTheta=1.2,
                           multiThreaded=False,  
 ​
                           scalingRatio=2.0,
                           strongGravityMode=False,
                           gravity=1.0,
 ​
                           verbose=True)
```

空间化二维网格图

```
 G = nx.grid_2d_graph(25, 25)
 print(nx.info(G))
 positions = fax.fax_networkx_layout(G, pos=None, iterations=5000)
 nx.draw_networkx(G, positions, node_size=20, with_labels=False, alpha=0.5)
 plt.axis('off')
 plt.show()
```

空间化随机几何图

```python
 G = nx.random_geometric_graph(400, 0.2)
 print(nx.info(G))
 positions = fax.fax_networkx_layout(G, pos=None, iterations=2000)
 nx.draw_networkx_nodes(G, positions, node_size=20, with_labels=False, node_color="blue", alpha=0.4)
 nx.draw_networkx_edges(G, positions, edge_color="green", alpha=0.05)
 plt.axis('off')
 plt.show()
```

在二维邻接矩阵上执行算法

```python
 G = np.array([[0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 1, 0]]) # simple 2x2 grid graph
 positions = fax.forceatlas2(G, pos=None, iterations=10000)
 ​
 networkx_graph = nx.from_numpy_matrix(G)
 nx.draw_networkx(networkx_graph, positions, node_size=20, with_labels=False, alpha=0.5)
 plt.axis('off')
 plt.show()
```
