如何使用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
相关产品推荐
相关产品推荐

