CFANetGraph类专门用于创建和可视化网络图,适用于:
pip install pyvis networkx pandas numpy
网络图构建和可视化类,支持节点和边的添加、属性设置,并可导出为交互式HTML。
支持特性: - 有向图和无向图 - 节点自定义(颜色、大小、标签、提示信息) - 边自定义(权重、标签) - 交互式HTML输出 - 自动浏览器打开
__init__(directed=True)参数:
- directed (bool, 默认=True): True为有向图,False为无向图
示例:
from FreeAeonML.FAVisualize import CFANetGraph
# 创建有向图
net = CFANetGraph(directed=True)
# 创建无向图
net_undirected = CFANetGraph(directed=False)
功能:向图中添加一个节点。
调用参数:
- label (str): 节点显示标签
- value (float/int): 节点值(影响节点大小)
- title (str): 悬停时显示的提示信息
- group (str, 默认=None): 节点分组(相同组的节点颜色相同)
- size (int, 默认=None): 节点大小
- color (str, 默认='#00ff1e'): 节点颜色(十六进制)
- node_id (int, 默认=None): 节点ID,不指定则自动生成
返回值: - int: 节点ID
示例代码:
from FreeAeonML.FAVisualize import CFANetGraph
net = CFANetGraph()
# 添加基本节点
node1_id = net.Add_Node(
label="起点",
value=100,
title="这是起点节点"
)
# 添加自定义样式节点
node2_id = net.Add_Node(
label="终点",
value=200,
title="这是终点节点",
color='#ff0000', # 红色
group='endpoint'
)
print(f"节点1 ID: {node1_id}, 节点2 ID: {node2_id}")
功能:在两个节点之间添加一条边。
调用参数:
- from_id (int): 起始节点ID
- to_id (int): 目标节点ID
- weight (float): 边的权重(影响边的粗细)
- label (str): 边的标签
返回值:无
示例代码:
from FreeAeonML.FAVisualize import CFANetGraph
net = CFANetGraph()
# 添加节点
n1 = net.Add_Node("A", 100, "节点A")
n2 = net.Add_Node("B", 200, "节点B")
n3 = net.Add_Node("C", 150, "节点C")
# 添加边
net.Add_Edge(n1, n2, weight=5, label="A到B")
net.Add_Edge(n2, n3, weight=3, label="B到C")
net.Add_Edge(n1, n3, weight=2, label="A到C")
功能:同时添加两个节点及其之间的边(如果节点已存在则不重复添加)。
调用参数:
- from_node (dict): 起始节点属性字典
- to_node (dict): 目标节点属性字典
- title (str, 默认=None): 边的标签
- weight (float, 默认=None): 边的权重
节点字典属性:
- id: 节点ID(可选)
- label: 显示标签
- value: 节点值
- title: 提示信息
- group: 分组
- size: 大小
- color: 颜色
返回值: - tuple: (from_id, to_id)
示例代码:
from FreeAeonML.FAVisualize import CFANetGraph
net = CFANetGraph()
# 定义节点
node_a = {
'label': '步骤A',
'value': 100,
'title': '第一步',
'color': '#3498db'
}
node_b = {
'label': '步骤B',
'value': 150,
'title': '第二步',
'color': '#e74c3c'
}
# 添加节点和边
id_a, id_b = net.Add(node_a, node_b, title="流向", weight=10)
# 继续添加
node_c = {'label': '步骤C', 'value': 200, 'title': '第三步'}
net.Add(node_b, node_c, title="下一步", weight=5)
功能:生成交互式HTML并保存到文件。
调用参数:
- file_name (str, 默认='pyvis.html'): 输出HTML文件名
返回值:无
示例代码:
from FreeAeonML.FAVisualize import CFANetGraph
net = CFANetGraph()
# 构建图
n1 = net.Add_Node("A", 100, "节点A")
n2 = net.Add_Node("B", 200, "节点B")
net.Add_Edge(n1, n2, weight=5, label="连接")
# 生成HTML
net.Show('my_network.html')
# 文件会保存在当前目录
功能:将DataFrame格式的时序数据可视化为网络图,自动按行顺序连接节点。
调用参数:
- df_in (DataFrame): 时序数据,必须包含列:
- label: 节点标签
- value: 节点值
- title: 提示信息
- group (可选): 分组
- size (可选): 大小
- color (可选): 颜色
- call_edge_info (function, 默认=None): 自定义边信息的回调函数
- file_name (str, 默认='pyvis.html'): 输出文件名
回调函数签名:
def custom_edge_info(from_node, to_node):
"""
计算边的权重和标签
Args:
from_node: 起始节点字典
to_node: 目标节点字典
Returns:
tuple: (weight, title)
"""
weight = max(from_node['value'], to_node['value'])
title = f"{from_node['value']}→{to_node['value']}"
return weight, title
示例代码:
from FreeAeonML.FAVisualize import CFANetGraph
import pandas as pd
# 创建时序数据
data = []
for i in range(10):
data.append({
'label': f'时刻{i}',
'value': i * 10,
'title': f'第{i}个时刻\n值={i*10}',
'color': '#3498db' if i % 2 == 0 else '#e74c3c'
})
df_data = pd.DataFrame(data)
# 自定义边信息
def my_edge_info(from_node, to_node):
diff = to_node['value'] - from_node['value']
weight = abs(diff)
title = f"变化: +{diff}"
return weight, title
# 生成时序网络图
CFANetGraph.Show_Series(
df_data,
call_edge_info=my_edge_info,
file_name='timeline.html'
)
功能:默认的边信息计算方法(Show_Series使用)。
调用参数:
- from_node (dict): 起始节点
- to_node (dict): 目标节点
返回值: - tuple: (weight, title)
示例代码:
from FreeAeonML.FAVisualize import CFANetGraph
# 测试默认边信息计算
node1 = {'value': 100}
node2 = {'value': 200}
weight, title = CFANetGraph.call_edge_info(node1, node2)
print(f"权重: {weight}, 标签: {title}")
# 输出: 权重: 200, 标签: 100:200
from FreeAeonML.FAVisualize import CFANetGraph
# 创建有向图
net = CFANetGraph(directed=True)
# 添加节点
start = net.Add_Node("开始", 100, "流程起点", color='#2ecc71')
process1 = net.Add_Node("数据处理", 150, "清洗数据", color='#3498db')
process2 = net.Add_Node("特征工程", 200, "提取特征", color='#3498db')
decision = net.Add_Node("模型训练", 250, "训练模型", color='#f39c12')
end = net.Add_Node("结束", 100, "流程终点", color='#e74c3c')
# 添加边
net.Add_Edge(start, process1, weight=5, label="开始")
net.Add_Edge(process1, process2, weight=8, label="处理完成")
net.Add_Edge(process2, decision, weight=10, label="特征就绪")
net.Add_Edge(decision, end, weight=5, label="训练完成")
# 生成HTML
net.Show('workflow.html')
print("流程图已生成: workflow.html")
from FreeAeonML.FAVisualize import CFANetGraph
net = CFANetGraph(directed=False)
# 第一组节点(蓝色)
for i in range(1, 4):
net.Add_Node(
f"A{i}",
value=100 + i*10,
title=f"A组节点{i}",
group='group_a',
color='#3498db'
)
# 第二组节点(红色)
for i in range(1, 4):
net.Add_Node(
f"B{i}",
value=100 + i*15,
title=f"B组节点{i}",
group='group_b',
color='#e74c3c'
)
# 组内连接
net.Add_Edge(1, 2, weight=5, label="A1-A2")
net.Add_Edge(2, 3, weight=5, label="A2-A3")
net.Add_Edge(4, 5, weight=5, label="B1-B2")
net.Add_Edge(5, 6, weight=5, label="B2-B3")
# 组间连接
net.Add_Edge(1, 4, weight=8, label="A1-B1")
net.Add_Edge(3, 6, weight=8, label="A3-B3")
net.Show('group_network.html')
from FreeAeonML.FAVisualize import CFANetGraph
import pandas as pd
import numpy as np
# 生成模拟股价数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=30, freq='D')
prices = 100 + np.cumsum(np.random.randn(30) * 2)
# 创建数据框
data = []
for date, price in zip(dates, prices):
trend = "上涨" if price > 100 else "下跌"
data.append({
'label': date.strftime('%m-%d'),
'value': abs(price),
'title': f"日期: {date.strftime('%Y-%m-%d')}\n价格: {price:.2f}\n趋势: {trend}",
'color': '#2ecc71' if price > 100 else '#e74c3c'
})
df_price = pd.DataFrame(data)
# 自定义边的计算方式
def price_edge_info(from_node, to_node):
from_val = from_node['value']
to_val = to_node['value']
change = to_val - from_val
weight = abs(change)
if change > 0:
title = f"涨 {change:.2f}"
else:
title = f"跌 {abs(change):.2f}"
return weight, title
# 生成时序网络图
CFANetGraph.Show_Series(
df_price,
call_edge_info=price_edge_info,
file_name='stock_timeline.html'
)
print("股价时序图已生成: stock_timeline.html")
from FreeAeonML.FAVisualize import CFANetGraph
net = CFANetGraph()
# 定义流程节点
steps = [
{'id': 1, 'label': '需求分析', 'value': 100, 'title': '分析业务需求'},
{'id': 2, 'label': '系统设计', 'value': 150, 'title': '架构设计'},
{'id': 3, 'label': '编码开发', 'value': 200, 'title': '代码实现'},
{'id': 4, 'label': '测试验证', 'value': 150, 'title': '功能测试'},
{'id': 5, 'label': '上线部署', 'value': 100, 'title': '生产环境部署'}
]
# 快速连接
for i in range(len(steps) - 1):
net.Add(
steps[i],
steps[i+1],
title=f"步骤{i+1}→{i+2}",
weight=10
)
net.Show('development_process.html')
from FreeAeonML.FAVisualize import CFANetGraph
net = CFANetGraph(directed=True)
# 中心节点
center = net.Add_Node(
"核心系统",
value=500,
title="中央处理系统",
color='#e74c3c',
size=50
)
# 添加子系统
subsystems = []
colors = ['#3498db', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c']
for i, (name, color) in enumerate(zip(['用户', '订单', '支付', '库存', '物流'], colors)):
node_id = net.Add_Node(
name + "系统",
value=200,
title=f"{name}子系统",
color=color,
group=name
)
subsystems.append(node_id)
# 连接到中心
net.Add_Edge(center, node_id, weight=8, label=f"管理{name}")
net.Add_Edge(node_id, center, weight=5, label=f"上报{name}数据")
# 子系统间的关联
net.Add_Edge(subsystems[0], subsystems[1], weight=6, label="下单")
net.Add_Edge(subsystems[1], subsystems[2], weight=6, label="付款")
net.Add_Edge(subsystems[1], subsystems[3], weight=6, label="扣库存")
net.Add_Edge(subsystems[3], subsystems[4], weight=6, label="发货")
net.Show('system_architecture.html')
生成的HTML文件具有以下交互特性:
<!-- 生成的HTML文件会包含交互式网络图 -->
<!-- 可以在任何现代浏览器中打开 -->
<!-- 支持拖拽、缩放、悬停等交互 -->
常用的十六进制颜色代码:
| 颜色 | 代码 | 说明 |
|---|---|---|
| 绿色 | #2ecc71 | 成功、正常 |
| 蓝色 | #3498db | 信息、处理中 |
| 红色 | #e74c3c | 错误、警告 |
| 橙色 | #f39c12 | 待处理 |
| 紫色 | #9b59b6 | 特殊状态 |
| 青色 | #1abc9c | 辅助信息 |
| 灰色 | #95a5a6 | 禁用、无效 |
# 订单处理流程
# 起点 → 下单 → 支付 → 发货 → 签收 → 完成
# 微服务架构
# API网关 → 用户服务/订单服务/支付服务 → 数据库
# 追踪某个指标的变化趋势
# 时刻1 → 时刻2 → 时刻3 → ...
# 模块依赖关系
# ModuleA → ModuleB → ModuleC
CFANetGraph基于以下库实现: - pyvis: 交互式网络图可视化 - networkx: 图结构处理 - webbrowser: 自动打开HTML文件
确保这些库已安装:
pip install pyvis networkx