【Python】networkx设置图信息(2)

官网:https://networkx.org/documentation/stable/reference/generators.html

使用自己的数据去手动创建自己的图形,而不是使用生成器,现从给graph添加和边入手,手动创建graph。

还是接着上一篇的教程,教程的3、4、5部分。start!!!

目录

1、给graph增加节点

2、给graph增加边

3、设置graph的信息

3.1、创建graph时添加属性(图属性)

3.2、指定节点的属性(节点属性)

3.3、指定边的属性(边属性)

3.4、显示graph


1、给graph增加节点

#添加单个节点
G1=nx.Graph()
G1.add_node(1)
G1.add_node("spam")

#添加一组节点
G2=nx.Graph()
G2.add_nodes_from([2, 3])
G2.add_nodes_from("spam")

#使用生成器
G3=nx.Graph()
H = nx.path_graph(10)
G3.add_nodes_from(H)

#注意:G1.add_nodes_from(H)表示用H中的节点表示G1这个graph,如果要往G1这个graph添加H这个graph,形成graph中的graph,可以使用以下命令
G4= nx.Graph()
G4.add_node(1)
G4.add_node(H)

glists=[G1,G2,G3,G4]
ginfo=['添加单个节点','添加一组节点','使用生成器','添加子图']
ShowGraph(glists,ginfo)

画图

from math import ceil
import matplotlib
import networkx as nx
import matplotlib.pyplot as plt

#该函数由于显示一组graph,传上来的是一组graph和这些graph的描述.
def ShowGraph(glists,ginfo,rowsize=4):
    
    #每行放rowsize个,计算可以放多少行
    row=ceil(len(glists)/rowsize)
    
    #定义组图
    plt.subplots(row,rowsize,figsize=(15,3))
    
    #开始画图
    for ind in range(len(glists)):
        #定义子图
        plt.subplot(row,rowsize,ind+1)
        nx.draw(glists[ind],with_labels=True, font_weight='bold')
        
        #设置图片
        plt.title(ginfo[ind],fontproperties=myfont)
        plt.axis('on')
        plt.xticks([])
        plt.yticks([])
    plt.show()

2、给graph增加边

#删除前面的graph
G1.clear()
G2.clear()
G3.clear()
G4.clear()

#添加单边
G1=nx.Graph()
G1.add_edge(1,2)
G1.add_edge(3, 'm')

#添加一组边
G2=nx.Graph()
e=(2,3)
G2.add_edge(*e)

#添加多组边
G3=nx.Graph()
G3.add_edges_from([(3,4),(4,2)])

#使用边生成器
G4= nx.Graph()
H = nx.path_graph(10)
G4.add_edges_from(H.edges)

#添加一组有权边
G5=nx.Graph()
G5.add_weighted_edges_from([('a', 'b', 5.0), ('b', 'c', 3.0), ('a', 'c', 1.0), ('c', 'd', 7.3)])  #边上权重显示看设置graph信息->指定边属性

glists=[G1,G2,G3,G4,G5]
ginfo=['添加单边','添加一组边','添加多组边','使用边生成器','添加一组有权边']
ShowGraph(glists,ginfo,rowsize=5)

可以看出上述的图没有边信息,如何打印信息更全面的图呢?

3、设置graph的信息

3.1、创建graph时添加属性(图属性)

#G.clear()
G = nx.Graph()
G = nx.Graph(day="Friday")
print('Assign graph attributes when creating a new graph: ',G.graph)
G.graph['day'] = "Monday"
print('Assign graph attributes when have a graph: ',G.graph)

# Assign graph attributes when creating a new graph: {'day': 'Friday'}
# Assign graph attributes when have a graph: {'day': 'Monday'}

3.2、指定节点的属性(节点属性)

#创建时设置
G.add_node(1, time='5pm')
G.add_nodes_from([3,4], time='2pm',color='g')

#直接设置
G.nodes[1]['room'] = 714
G.nodes[1]['color'] = 'b'

print(G.nodes.data())

# [(1, {'room': 714, 'time': '5pm', 'color': 'b'}), (3, {'time': '2pm', 'color': 'g'}), (4, {'time': '2pm', 'color': 'g'})]

3.3、指定边的属性(边属性)

#创建时设置
G.add_edge(1, 2, weight=4.7 )
G.add_edges_from([(3, 4), (4, 5)], color='red',weight=10)
G.add_edges_from([(1, 2, {'color': 'blue'}), (2, 3, {'weight': 8})])

#直接设置
G[1][2]['weight'] = 4.7
G[1][2]['color'] = "blue"
G.edges[3, 4]['weight'] = 4.2
G.edges[1, 2]['color'] = "green"

print('edge 1-2: ',G.edges[1,2])
print('edge 3-4: ',G.edges[3,4])


# edge 1-2: {'weight': 4.7, 'color': 'green'}
# edge 3-4: {'weight': 4.2, 'color': 'red'}

3.4、显示graph

#生成节点标签
labels={}
labels[1]='1'
labels[2]='2'
labels[3]='3'
labels[4]='4'
labels[5]='5'

#获取graph中的边权重
edge_labels = nx.get_edge_attributes(G,'weight')
print('weight of all edges:',edge_labels)

#生成节点位置
pos=nx.circular_layout(G)
print('position of all nodes:',pos)

#把节点画出来
nx.draw_networkx_nodes(G,pos,node_color='g',node_size=500,alpha=0.8)

#把边画出来
nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5,edge_color='b')

#把节点的标签画出来
nx.draw_networkx_labels(G,pos,labels,font_size=16)

#把边权重画出来
nx.draw_networkx_edge_labels(G, pos, edge_labels)

plt.axis('on')
#去掉坐标刻度
plt.xticks([])
plt.yticks([])
plt.show()


# weight of all edges: {(1, 2): 4.7, (3, 4): 4.2, (2, 3): 8, (4, 5): 10}
position of all nodes: {
1: array([1.00000000e+00, 2.38418583e-08]), 
2: array([0.30901696, 0.95105658]), 
3: array([-0.80901709, 0.58778522]), 
4: array([-0.80901698, -0.58778535]), 
5: array([ 0.30901711, -0.95105647])}

参考:

完整教程在第一节

NetworkX系列教程(3)-手动创建graph

NetworkX系列教程(4)-设置graph的信息

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值