能否用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
相关产品推荐
相关产品推荐

