Pyvis与Networkx:如何按来源/目标或类型为节点设置不同颜色
解决PyVis节点颜色不生效及按type属性定义颜色问题
问题说明
你编写的代码试图通过NetworkX设置节点颜色,但生成的PyVis HTML页面中节点未变色。当前需求分两步:
- 先实现Team节点显示红色、State节点显示黑色
- 最终根据CSV中的
type属性定义Team节点颜色(nfl=红色,nba=黑色,mlb=绿色)
源CSV文件
team,state,Weight,type Knicks,New York,9,nba Warriors,California,9,nba Giants,California,3,mlb 49ers,California,6,nfl Cowboys,Texas,1,nfl Giants,New York,2,nfl
原始代码问题点
你的代码中nx.draw(G, node_color=colors)是给Matplotlib绘图设置颜色,而PyVis的net.from_nx(G)不会继承NetworkX的这个颜色配置,必须给NetworkX节点添加color属性才能被PyVis识别。
解决方案一:实现Team/State节点区分颜色
修改代码,直接给NetworkX的节点添加color属性,PyVis导入时会自动应用该属性:
import networkx as nx import pandas as pd from pyvis.network import Network df = pd.read_csv('./data_files/sample.csv') # 创建图 G = nx.from_pandas_edgelist(df, source='team', target='state', edge_attr='Weight') # 给节点添加color属性 team_nodes = set(df["team"].values) for node in G.nodes: if node in team_nodes: G.nodes[node]['color'] = "red" else: G.nodes[node]['color'] = "black" # 初始化PyVis网络并导入图 net = Network(notebook=True, filter_menu=True, cdn_resources='remote') net.from_nx(G) net.show("./output/teams.html")
解决方案二:按type属性定义Team节点颜色
注意:同一个Team可能对应多个type(如Giants同时属于mlb和nfl),以下代码取每个Team第一次出现的type来映射颜色,你可根据需求调整规则(如取出现次数最多的type):
import networkx as nx import pandas as pd from pyvis.network import Network df = pd.read_csv('./data_files/sample.csv') # 创建type到颜色的映射 type_color_map = { 'nfl': 'red', 'nba': 'black', 'mlb': 'green' } # 生成每个Team对应的颜色(取第一次出现的type) team_color_map = df.groupby('team')['type'].first().map(type_color_map).to_dict() # 创建图 G = nx.from_pandas_edgelist(df, source='team', target='state', edge_attr='Weight') # 给节点设置颜色 team_nodes = set(df["team"].values) for node in G.nodes: if node in team_nodes: # 用Team对应的type颜色 G.nodes[node]['color'] = team_color_map[node] else: # State节点设为默认灰色,可自定义 G.nodes[node]['color'] = "#888888" # 生成可视化页面 net = Network(notebook=True, filter_menu=True, cdn_resources='remote') net.from_nx(G) net.show("./output/teams.html")
内容的提问来源于stack exchange,提问作者Evan Camila
相关产品推荐
相关产品推荐

