You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NetworkX绘制有向图节点属性的分布情况

解答

完全可以实现,节点属性分布绘制逻辑和度分布绘制本质一致,都是提取对应值序列后绘制统计图表即可。

方案1:改造现有函数适配属性分布绘制

nx.get_node_attributes返回的是「节点ID: 属性值」的字典,直接取values就能得到属性值序列,替换原函数里的度序列即可。
首先补充必要导入:

import networkx as nx
import matplotlib.pyplot as plt

通用属性分布绘制函数(推荐)

直接传图和属性名即可调用,不需要提前单独提取属性:

def plot_node_attr_dist(G, attr_name):
    # 提取对应属性的所有值
    attr_values = list(nx.get_node_attributes(G, attr_name).values())
    plt.hist(attr_values)
    plt.xlabel(attr_name)
    plt.ylabel("节点数量")
    plt.title(f"{attr_name}属性分布")
    plt.show()

# 调用示例,分别绘制三类属性分布
plot_node_attr_dist(G, "Name")
plot_node_attr_dist(G, "Age")
plot_node_attr_dist(G, "Height")

如果要沿用你提前提取属性的写法,也可以直接传入属性值列表:

def plot_dist(value_list, x_label):
    plt.hist(value_list)
    plt.xlabel(x_label)
    plt.ylabel("节点数量")
    plt.title(f"{x_label}分布")
    plt.show()

# 调用示例
age = nx.get_node_attributes(G, "Age")
plot_dist(list(age.values()), "Age")

方案2:更优的绘制方案

  • 区分属性类型选择图表:Name属于分类属性,用直方图不合适,更推荐用条形图统计不同名称的节点数量;Age、Height是数值型属性,除了直方图还可以叠加核密度估计曲线看分布趋势。
    小提示:如果Name属性的唯一值过多,绘制条形图前可以先筛选出现频率Top N的分类,避免图表拥挤
  • 配合Pandas、Seaborn库绘制,效果更美观,也方便后续做其他属性分析:
import seaborn as sns
import pandas as pd

# 一次性提取所有节点属性转为DataFrame,方便后续各类分析
attr_df = pd.DataFrame([attrs for _, attrs in G.nodes(data=True)])

# 1. 绘制分类属性Name的分布(条形图)
sns.countplot(data=attr_df, x="Name")
plt.xticks(rotation=45) # 名称过长时旋转x轴标签避免重叠
plt.show()

# 2. 绘制数值属性Age的分布(直方图+核密度估计)
sns.histplot(data=attr_df, x="Age", kde=True)
plt.show()

# 3. 绘制Height分布同理
sns.histplot(data=attr_df, x="Height", kde=True)
plt.show()

该方案的优势是把所有节点属性转成DataFrame后,不仅可以方便绘制分布,后续要做属性相关性分析、分组统计都更高效,是处理节点属性数据的常用做法。


内容的提问来源于stack exchange,提问作者lo7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:57:00