【Python】Matplotlib画图(十)——基于networkx画关系网络图

前言

昨天才开始接触,鼓捣了一个下午,接下来会持续更新,如果哪里有错误的地方,望各位大佬指出,谢谢!

数据描述

两个文件,一个文件包含了网络图的节点,节点存在类别(0,1,2,3)四类,但是0类别舍去,不画出;另一个文件包含了网络图的边,数据基本特征如下:

             

图1中,id表示节点,b是类别;图2中,两个数字表示边连接的两个点。

Networkx

安装

我的系统是Mac OS,直接在terminal输入sudo pip install networkx就可以安装,由于代码中涉及几个函数,在python3中会报错,我用python2.7.13实现的

基本使用方法

import networkx as nx                   #导入networkx包
import matplotlib.pyplot as plt     #导入绘图包matplotlib(需要安装,方法见第一篇笔记)
G =nx.random_graphs.barabasi_albert_graph(100,1)   #生成一个BA无标度网络G
nx.draw(G)                          #绘制网络G
plt.savefig("ba.png")           #输出方式1: 将图像存为一个png格式的图片文件
plt.show()                            #输出方式2: 在窗口中显示这幅图像

参数介绍

基本

- `node_size`: 指定节点的尺寸大小(默认是300,单位未知,就是上图中那么大的点)
- `node_color`: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜色,例如'r'为红色,'b'为绿色等,具体可查看手册)
- `node_shape`: 节点的形状(默认是圆形,用字符串'o'标识,具体可查看手册)
- `alpha`: 透明度 (默认是1.0,不透明,0为完全透明)
- `width`: 边的宽度 (默认为1.0)
- `edge_color`: 边的颜色(默认为黑色)
- `style`: 边的样式(默认为实现,可选: solid|dashed|dotted,dashdot)
- `with_labels`: 节点是否带标签(默认为True)
- `font_size`: 节点标签字体大小 (默认为12)
- `font_color`: 节点标签字体颜色(默认为黑色)
布局
circular_layout:节点在一个圆环上均匀分布
random_layout:节点随机分布
shell_layout:节点在同心圆上分布
spring_layout: 用Fruchterman-Reingold算法排列节点
spectral_layout:根据图的拉普拉斯特征向量排列节点

代码

# coding:utf-8


import networkx as nx 
import matplotlib.pyplot as plt
import csv

with open('node-8.csv','rb') as csvfile:
	reader = csv.DictReader(csvfile)
	column = [row['b'] for row in reader]
	id_tag0 = [row['id'] for row in reader]
#print column
id_tag = []
for item in id_tag0:
	id_tag.append(int(item))

# =================Setting node parameters====================
node_0 = []
node_1 = []
node_2 = []
node_3 = []
node_color = []
node_color_y = []
node_color_r = []
node_color_g = []
node_color_b = []
node_shape = []
node_shape_0 = []
node_shape_1 = []
node_shape_2 = []
node_shape_3 = []

for i in range(len(column)):
	if int(column[i]) == 0:
		pass
	elif int(column[i]) == 1:
		color = 'r'
		shape = 'o'
		node_1.append(i)
		node_color_r.append(color)
		node_shape_1.append(shape)
	elif int(column[i]) == 2:
		color = 'g'
		shape = 'o'
		node_2.append(i)
		node_color_g.append(color)
		node_shape_2.append(shape)
	else:
		color = 'b'
		shape = '*'
		node_3.append(i)
		node_color_b.append(color)
		node_shape_3.append(shape)
	node_color.append(color)
	node_shape.append(shape)
# ==============================================================


with open('node-8.csv','rb') as csvfile:
	reader = csv.DictReader(csvfile)
	column1 = [row['b'] for row in reader]
	id_tag1 = [row['id'] for row in reader]
#print column
id_tag11 = []
for item in id_tag1:
	id_tag11.append(int(item))



edge = []
with open('edge-8.txt','r') as f:  
	data = f.readlines()  
	for line in data:
		#print line
		line = tuple(line.replace('\r','').replace('\n','').replace('\t','').split(','))
		edge.append(line)
#print edge

# ===============Setting edge parameters=========================
edge_color = []
edge_style = []

for item in edge:
	#print item
	if int(column1[int(item[0])]) == 0 or int(column1[int(item[1])]) == 0:
		pass
	elif int(column1[int(item[0])]) == 1 or int(column1[int(item[1])]) == 1:
		color = 'r'
		#style0 = 'dashdot'
		#color_r_list.append(color)
	elif int(column1[int(item[0])]) == 2 or int(column1[int(item[1])]) == 2:
		color = 'g'
		#style0 = 'dashed'
		#color_r_list.append(color)
	else:
		color = 'b'
		#style0 = 'dotted'
		#color_b_list.append(color)
	edge_color.append(color)
	#edge_style.append(style0)


G = nx.Graph()
#G.add_nodes_from(id_tag)
G.add_edges_from(edge)

#nx.draw(G,pos=nx.random_layout(G), nodelist = node_0, node_color = node_color_y, node_size=120, node_shape=node_shape_0)
#nx.draw(G,pos=nx.random_layout(G), nodelist = node_1, node_color = node_color_r, node_size=120, node_shape=node_shape_1)
#nx.draw(G,pos=nx.random_layout(G), nodelist = node_2, node_color = node_color_g, node_size=120, node_shape=node_shape_2)
#nx.draw(G,pos=nx.random_layout(G), nodelist = node_3, node_color = node_color_b, node_size=120, node_shape=node_shape_3)

nx.draw_networkx(G,pos=nx.random_layout(G),node_color=node_color,node_size=10,node_shape='o',edge_color=edge_color,width=0.3,style='solid',font_size=8) 
#nx.draw_networkx(G,pos=nx.random_layout(G),nodelist = node_1,node_color=node_color,node_size=100,node_shape='o',style='dashdot') 
#nx.draw_networkx(G,pos=nx.random_layout(G),node_color=color_g_list,node_size=150,node_shape='^',style='dashed') 
#nx.draw_networkx(G,pos=nx.random_layout(G),node_color=color_b_list,node_size=150,node_shape='*',style='dotted') 

#plt.legend()
#nx.draw_networkx(G)
plt.show()

画图


参考链接

### 回答1: 以下是一个使用 NetworkX 库绘制随机网络图形的示例代码: ```python import networkx as nx import matplotlib.pyplot as plt import random # 创建一个空的无向图 G = nx.Graph() # 添加随机节点 for i in range(10): G.add_node(i) # 添加随机边 for i in range(10): for j in range(i+1, 10): if random.random() < 0.5: G.add_edge(i, j) # 绘制图形 pos = nx.spring_layout(G) nx.draw(G, pos, with_labels=True) plt.show() ``` 在上面的示例代码中,我们首先创建了一个空的无向图 `G`,然后添加了 10 个随机节点,并使用 `random` 方法随机添加了一些边。最后,使用 `spring_layout` 方法对节点进行布局,并使用 `draw` 方法绘制图形。你可以根据需要调整节点数量、边的概率等参数,来生成不同的随机网络图形。 ### 回答2: Python中有许多库可以用来绘制随机网络图形,例如NetworkXMatplotlib。下面是一个使用NetworkXMatplotlib库绘制随机网络图形的示例: ```python import networkx as nx import matplotlib.pyplot as plt import random # 创建一个空的无向图 G = nx.Graph() # 添加随机节点 num_nodes = 10 for i in range(num_nodes): G.add_node(i) # 添加随机边 num_edges = 15 for i in range(num_edges): # 随机选择两个节点,并判断它们之间是否已经有边 # 若没有边则添加一条边 while True: node1 = random.choice(list(G.nodes)) node2 = random.choice(list(G.nodes)) if not G.has_edge(node1, node2): G.add_edge(node1, node2) break # 绘制网络图形 nx.draw(G, with_labels=True, node_color='lightblue', edge_color='gray') plt.show() ``` 在这个例子中,首先我们创建了一个空的无向图 `G`,然后通过循环添加了一些随机节点和随机边。然后,使用`nx.draw()`函数绘制了这个网络图形,并使用`with_labels=True`参数显示节点标签,`node_color='lightblue'`设置节点的颜色,`edge_color='gray'`设置边的颜色。最后使用`plt.show()`展示了这个图形。 运行这段代码,会生成一个随机的网络图形,其中节点和边都是随机生成的。 ### 回答3: Python是一种强大的编程语言,它具有广泛的应用领域,包括数据分析、人工智能和可视化等。其中,通过使用Python绘制随机网络图形是一项常见任务。 在Python中,可以使用多个第三方库来实现绘制随机网络图形的功能。其中,最常用的库是NetworkXNetworkX是一个用于创建、操作和研究复杂网络的Python库。 首先,我们需要在开发环境中安装NetworkX库。在安装完成后,可以开始编写代码来创建随机网络图形。 首先,我们需要导入所需的库: ```python import networkx as nx import matplotlib.pyplot as plt import random ``` 然后,我们创建一个空的图形对象: ```python G = nx.Graph() ``` 接下来,我们可以生成节点和边。可以采用循环的方式来添加节点: ```python num_of_nodes = 10 for i in range(num_of_nodes): G.add_node(i) ``` 然后,我们可以使用循环生成随机的边: ```python num_of_edges = 15 for i in range(num_of_edges): random_node1 = random.choice(list(G.nodes())) random_node2 = random.choice(list(G.nodes())) if random_node1 != random_node2: G.add_edge(random_node1, random_node2) ``` 最后,我们可以使用Matplotlib库来绘制图形: ```python nx.draw_networkx(G) plt.show() ``` 以上就是使用Python绘制随机网络图形的示例代码。你可以根据实际需求进行调整和扩展,例如改变节点和边的数量,添加节点属性和边权重等。 总结起来,使用Python绘制随机网络图形是一项易于实现且功能强大的任务,通过使用NetworkXMatplotlib等库,我们可以快速生成和可视化复杂的网络图形。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值