一,先说实现的思路

1,将文本中出现的重要人物名字放入列表中;也可以使用自然语言处理工具将词性标记为‘nr’的词语放入列表中,但一则费时费力二则准确性太差。所以,简单粗暴但高效的做法是直接从搜索引擎中得到主要人物的名称,并将其放入列表中;

2,遍历文本的第一个段落,并检查人物名称是否在此段落中,如果在,将其放入一个空列表中,并使用combination将其转化成人物名称的两两组合;这是很关键的一步,只有得出了人物关系,才可能实现可视化。

3,使用Networkx实现人物关系的可视化,这个操作很简单,但如果想优化节点和线,还是有一些难度的。贴上代码后再详细说明此点。

二,使用到的内置或三方库;

1,set,在遍历文本的每一个段落时,形成的列表中会有多个重复的人物名称,使用set可以去除重复的人名;

2,sorted,为避免形成[A,B]和[B,A]两种本质上相同的关系,使用sorted排序,可以防止出现前述的AB两种关系;

3,itertools库中的combination,[A,B,C]只形成[A,B],[A,C],[B,C]三种关系,符合我们的需求;

4,collections中的Counter,统计每一对关系在列表中出现的次数,形成一个字典;

5,networkx库,使用networkx.draw_circular,让人物以圆的形式排列在图片上。

三,networkx.draw_circular parameter的详细解说:

1,nodelist和node_size,引用g.degree的键值,可通过映射在图表上反映节点的大小,出现越多的节点,在图表上也越大;

2,node_color和cmap,node_color是一个列表,通过colormap与plt.cm.parameter形成映射,在图表上反映为节点的颜色,具体的颜色值可以参考https://matplotlib.org/gallery/color/colormap_reference.html;

3,edge_color和edge_cmap,edge_color也是一个列表,通过edge_cmap与plt.cm.parameter开成映射,在图表上表现为边的颜色;

4,width,width也是一个列表,引用自边的值,即人物关系字典的值;

四,图片比例尺,分辨率和将文本插入到图片中;

1,比例尺,在绘图前使用plt.figure(figsize=(turple))来确定每个像素块的比例尺;

2,分辨率,DPI与比例尺的结合,其中dpi在保存文件的命令savefig中引用,默认值是100;

3,将文本插入图片,x,y指插入的位置,中间为0,0,边上为+/-1。

五,附上两张效果图。

六,附上源代码。

from collections import Counter
from itertools import combinations
import networkx as nx
import matplotlib.pyplot as plt
def getRelationiship(fn):namelist=['无忌','赵敏','芷若','小昭','殷离','成昆','谢逊','灭绝','翠山','殷素素','纪晓芙','杨逍','杨不悔','范遥','金花婆婆','张三丰','殷天正','韦一笑','宋青书','丁敏君','宋远桥','俞岱岩','殷梨亭','殷野王','阳顶天','阳夫人','朱九真','空见大师','空智大师','周颠','王保保','黄衫女子','王难姑','俞莲舟','张松溪','莫声谷','鹿杖客','鹤笔翁','渡厄','渡难','渡劫','韩千叶','常遇春','铁冠道人','彭莹玉','说不得','冷谦','鲜于通','何太冲','班淑娴','高老者','矮老者']fo=open(fn,'r',encoding='utf-8').readlines()relationlist=[]for lines in fo:n=[]for i in namelist:for j in namelist[namelist.index(i)+1:]:if i in lines and j in lines and i!=j:n.append(i)relationlist+=combinations(sorted(set(n)),2)relationDict=Counter(relationlist)return relationDict,namelistdef createRelationship(fn):relationDict,namelist=getRelationiship(fn)edgeWidth=[]for i in relationDict.values():edgeWidth.append(i/5)# print(edgeWidth)print(len(edgeWidth))plt.figure(figsize=(16, 9))#图片比例尺,跟dpi合并计算后就是图片的分辨率,注意figure要放在画图开始前g=nx.MultiGraph()g.add_edges_from(relationDict.keys())d=dict(g.degree)nx.draw_circular(g,nodelist=d.keys(),node_size=[v*200 for v in d.values()],node_color=range(46),cmap=plt.cm.Paired,with_labels=True,edge_color=range(385),edge_cmap=plt.cm.Dark2,alpha=1.0,width=edgeWidth)# node_color,要使用报错提醒的数字,edge_color使用len(edgewidth),但直接引用报错。#nodelist节点名称,node_size节点大小,node_color&cmap节点颜色的映射,edge_color&edge_cmap线颜色的映射,width宽度的值plt.rcParams['font.sans-serif'] = ['SimHei']plt.text(-1.05,1.05,'%s-人物关系(线越宽代表联系越紧密,点越大表示出现的次数越多)'%fn[:-4],fontsize=12)#-1,1字体位置plt.savefig('%s-=人物关系图.png'%fn[:-4],dpi=120)#单个像素的DPI

2020年6月16日更新:

因为源代码不在这台电脑上,只针对其中不明确的地方做个说明:

1,46,是人物节点的数量,可以使用len(namelist)代替;

2,385,是边的数量,可以使用len(relationDict)代替;

3,node_size使用的是matplotlib里scatter的规格值,默认是300,到底怎么算出来的,我看了官方文档,也做过计算,都没搞明白。

很抱歉,初学时的代码,有点混乱,但大概能看明白的。

感谢阅读!

python使用Networkx生成人物关系可视化详解相关推荐

  1. 人物关系可视化python实现

      今天跟大家介绍以下知识.怎么来实现文本中的人物关系可视化? 一.软件安装   安装的软件,点击此处,整个流程及安装过程见参考博客 提醒一下:   注意下载的文件一定要和自己的python版本和电脑 ...

  2. python 知识图谱 红楼_毕业设计:基于知识图谱的《红楼梦》人物关系可视化(运行篇)...

    知识图谱是个非常有趣的方向,在公司业务应用方面也非常广泛.比如对搜索推荐的优化,让推荐的内容更加丰富,甚至给用户以意外之喜.比如在智能问答方面,避免多轮对话,从用户的一个简单的问句,给用户丰富的答案, ...

  3. python自然语言分析--倚天屠龙记人物关系、词云、柱状图、-词频

    python倚天屠龙记人物关系.词云.柱状图.-词频 # -*- coding = utf-8 -*- # @Time : 2022/3/17 15:45 # @Author : luxiaoguo ...

  4. python机械臂仿真_VTK与Python实现机械臂三维模型可视化详解

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

  5. python中类的构成_Python中类型关系和继承关系实例详解

    本文详细介绍了Python中类型关系和继承关系.分享给大家供大家参考.具体分析如下: 如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航.这种导航关系使 ...

  6. 【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part6基于图谱的问答实现

    前序文章: [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视化及问答系统实践:part1项目介绍与环境准备 [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视 ...

  7. 漫威电影人物关系可视化

    3D Force-Directed Graph 这是一个使用ThreeJS/WebGL的三维力定向图形组件. github地址:vasturiano/3d-force-graph: 3D force- ...

  8. 基于pyecharts的《红楼梦》人物关系可视化

    <红楼梦>人物关系可视化 <红楼梦>是我国四大名著之一,也是高中生必读书目之一.同学们在阅读红楼梦的时候,是否有以下困惑?人物太多?人物关系太复杂? 我们今天尝试着用信息技术中 ...

  9. VTK与Python实现机械臂三维模型可视化详解

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

最新文章

  1. 用c语言编写程序学工系统,[工学]chap02_用C语言编写程序.ppt
  2. WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
  3. java父进程获取子进程异常_如何在perl的父进程中获取死亡的子进程的PID?
  4. Spark基本操作SparkSession,DatasetRow,JavaRDDRow
  5. How to custom RedHat DVD
  6. 脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报
  7. 09 | 队列:队列在线程池等有限资源池中的应用
  8. 各种主流Linux操作系统概况
  9. Madagascar中的宏定义--圆周率PI
  10. mysql 无法创建用户_mysql不能创建用户
  11. perl的几个小tips
  12. 软件测试(测试用例)—写用例无压力
  13. 计算机软件答辩ppt范文,计算机毕业答辩ppt模板范文.ppt
  14. MSXML版本6.10.1129.0
  15. vc如何引入lib库
  16. Centos7开机之后连不上网 ens33:<BROADCAST,ULTICAST>mtu 1588 qdisc noop state DOWl group default qlen 1888
  17. arcgis 触屏实现键盘模拟
  18. 人脸活体检测论文:Multi-Modal Face Anti-Spoofing Based on Central Difference Networks
  19. FAR PASCAL 的解释
  20. Samsung Galaxy S5(G9006V)刷机降级(Android 6.0.1-Android 4.4.2)(MD)

热门文章

  1. vue点击复制链接功能两种方法实现
  2. 海底捞面馆是谁的拦路虎,又是谁的敲门砖?
  3. 有道云笔记丢失解决方案(PC端)
  4. 华为上拉添加计算机,华为底部上拉菜单 | 手游网游页游攻略大全
  5. DDR3 基本指令描述及参考资料
  6. mysql中文匹配问题--总结
  7. 30页PPT下载 |《传媒行业:把握产业新趋势,持续布局5G应用端》
  8. NVIDIA重新铺货GT 1030/GTX 1650来解市场燃眉之急
  9. 高通为自己洗白:证据居然是华为麒麟芯片
  10. 省 市 县 三级联动