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

能否用Python的NetworkX构建指定样式家谱?求实现方案

使用NetworkX构建指定样式家谱的解决方案

完全可以用NetworkX实现你想要的家谱样式,具体方案如下:

布局选择

对于家谱这类层级结构明确的图,手动指定节点位置是最优选择(就像你代码里的pos字典),能精准控制每个节点的位置,避免自动布局的不可控性,完美匹配家谱的层级排版需求。

边绘制问题的解决思路

NetworkX默认会直接从节点中心连线,要实现「从父母节点间边的中点出发连接子节点」的效果,需要手动计算中点并绘制这条边,具体步骤和代码如下:

修改后的代码

import networkx as nx 
import matplotlib.pyplot as plt  

# 创建有向图
G = nx.DiGraph()  
# 添加家庭成员节点
G.add_nodes_from(['Father of Me', 'Mother Of Me', 'Me'])  
# 添加父母之间的婚姻关系边
G.add_edge('Father of Me', 'Mother Of Me')  

# 手动定义每个节点的坐标位置
pos = {'Father of Me': (0, 1), 'Mother Of Me': (2, 1), 'Me': (1, 0)}  

# 绘制节点和标签
nx.draw_networkx_nodes(G, pos, node_size=1500, node_color='lightblue')
nx.draw_networkx_labels(G, pos, font_size=10)

# 绘制父母之间的边
nx.draw_networkx_edges(G, pos, edgelist=[('Father of Me', 'Mother Of Me')], edge_color='black')

# 计算父母节点连线的中点坐标
father_pos = pos['Father of Me']
mother_pos = pos['Mother Of Me']
mid_point = ((father_pos[0] + mother_pos[0])/2, (father_pos[1] + mother_pos[1])/2)

# 从中点绘制到子节点的边
plt.plot([mid_point[0], pos['Me'][0]], [mid_point[1], pos['Me'][1]], color='black')

# 隐藏坐标轴,优化显示效果
plt.axis('off')
plt.show()

代码说明

  • 拆分绘制流程,手动控制节点、标签、边的绘制顺序,避免默认绘制逻辑的干扰
  • 不再添加父母到子节点的两条直接边,而是通过计算父母连线的中点,用matplotlib的plot函数绘制中点到子节点的单条边,完全匹配你想要的样式
  • 保留父母之间的边,还原家谱的婚姻关系表达

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:40:00