pip install networkx
network可以用来画节点图,这里介绍如何使用networkx来画知识图谱
networkx内置了多种图对象。
主要是这四种
Graph:无多重边无向图
DiGraph:无多重边有向图
MultiGraph:有多重边无向图
MultiDiGraph:有多重边有向图
创建图的方式
from nework import *
G=DiGraph()#有向图
G=MultiDiGraph()#多重有向图
布局方法一般有这五种
circular_layout:节点在一个圆环上均匀分布
random_layout:节点随机分布
shell_layout:节点在同心圆上分布
spring_layout:用Fruchterman-Reingold算法排列节点,中心放射状分布
spectral_layout:根据图的拉普拉斯特征向量排列节点
最好的可能是spring_layout
添加布局的方法
pos=nx.spring_layout(self.graph)#建立布局对象
#再在draw时传入
draw(...,pos=pos,...)
添加节点有两种方法
self.G.add_node(节点名,节点属性=值....)
#节点名只有一个节点属性可以有很多,节点的label默认是节点名
#节点的属性就只是属性,没有太多实际意义
self.G.add_nodes_from([节点名列表])
#如[1,2,3,4],那就添加4个节点,分别是1节点,2节点,3节点,4节点。
对于add_nodes_from(),可以这样用
self.G.add_nodes_from([(1,{color:"red"}),(2,{size:123})])
#参数是一个集合,集合内一个节点用一个元组,元组的第一个属性是节点名,
#第二个属性是一个字典,用来指定节点的属性,但这个属性只是属性,
#没有实际意义,如color不会改变节点的颜色,size不会改变节点大小。
num=self.G.number_of_nodes()#获取图的节点数量
node_list=self.G.nodes()#获取节点的列表
#显示
#2
#[1,2]
self.G.remove_node(1) #删除指定节点
self.G.remove_nodes_from(['b','c','d','e']) #删除集合中的节点
注意在添加边时如果没有这个点,它会新添加这两个点,再连线,后续画图的时候有可能会出现问题。
self.G.add_edge(起点,终点,边缘属性=值...)
#有向图会考虑起点终点,无向图把这两个点直接连接就行。
self.G.add_edges_from([(起点1,终点1),(起点2,终点2)])
#也可以直接按列表添加
#add_edges_from()也可以添加属性
self.G.add_edges_from([(起点1,终点1,{color="red"}),(起点1,终点1,{size=11,边缘属性=值})])
self.G.number_of_edges()#获得G的边的个数
self.G.edges()#获得边的列表
self.G.remove_edge(1,2) #删除边
self.G.remove_edges_from([(11,12), (13,14)])#删除边列表
pos=nx.spring_layout(self.graph)#建立布局对象
draw_networkx_nodes(self.G, pos, node_size=list,alpha=0.3, node_color=list)
#专门只画节点,第一个参数是图对象,第二个是布局,
#后面用key=value的形式可以设置节点的node_size,node_color.
#这两个的value可以是一个定值也可以是一个列表,列表里的元素的个数要和节点个数一样。
draw_networkx_nodes(G, pos, nodelist=None, node_size=300, node_color='#1f78b4', node_shape='o', alpha=None,cmap=None,vmin=None, vmax=None, ax=None, linewidths=None, edgecolors=None, label=None, **kwds)
draw_networkx_edges(G, pos, edgelist=None, width=1.0, edge_color='k', style='solid', alpha=None, arrowstyle='-|>', arrowsize=10,edge_cmap=None, edge_vmin=None, edge_vmax=None, ax=None, arrows=True, label=None, node_size=300, nodelist=None,node_shape='o', connectionstyle=None, min_source_margin=0, min_target_margin=0, **kwds)
#value可以是值,也可以是[]
#专门画边缘
draw_networkx_labels(G, pos, labels=None, font_size=12, font_color='k', font_family='sans-serif', font_weight='normal',alpha=None, bbox=None, ax=None, **kwds)
#只画图标签
draw_networkx_labels(G, pos, labels=None, font_size=12, font_color='k', font_family='sans-serif', font_weight='normal',alpha=None, bbox=None, ax=None, **kwds)
#只画边标签
这些里面一定要有的参数是G和pos,alpha是透明度,cmap是颜色映射,其他的按需画图就行。
还有一个总画图函数
draw(slef.G,pos,key=value)
#会把图都画出来
import matplotlib.pyplot as plt
plt.figure(figsize=(19.2,16.8))
nx.draw(self.graph,pos,with_labels=True,node_size=size_list,node_color=color_list,labels=lables_list,font_size=13)
nx.draw_networkx_edge_labels(self.graph,pos,edge_labels=edge_label,font_size=20)
plt.show()
#记得要用matplotlib.pyplot创建窗口,并用show()显示
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
#当label是中文时可能显示不出来,这时候在画图前加入这行代码,就可以正常显示了
import matplotlib.pyplot as plt
plt.savefig(r'picture/{}.png'.format(timestr))
#记得要在show()之前保存,不然只会保存白板