Python网络图,原节点label不规则,如何实现节点大小随节点度数的变化而变化
欢迎大家交流,本人邮箱:17376598018@163.com:
- networkx
- matplotlib
- 无序label处理
- 节点大小控制
- 指定显示部分节点名称
代码块
代码块语法遵循标准markdown代码,例如:
import numpy as np
import xlrd
import networkx as nx
import matplotlib.pyplot as plt
# 自定义坐标轴
# plt.axis([-0.05,1.05,-0.05,1.05])
# 不显示坐标轴刻度(下面三行)
fig, ax=plt.subplots()
ax.set_xticks([])
ax.set_yticks([])
# 数据导入,预处理
List = []
def open_excel(file):
try:
sheet_data = xlrd.open_workbook(file)
return sheet_data
except Exception as e:
print(str(e))
def praise_excel(file):
sheet_data = open_excel(file)
sheet = sheet_data.sheets()[0] #读取sheet
my_queues0 = sheet.col_values(0) #读取1列
my_queues1 = sheet.col_values(1) #读取2列
nrows = sheet.nrows #获取行数
for i, j in zip(my_queues0,my_queues1):
x = (int(i),int(j))
List.append(x)
# print(List)
praise_excel("D:/PycharmProjects/Draw/Network_Plot.xlsx")
# 列表中有元组的,默认对元组的第一列进行排序
temp1 = sorted(List)
# 补充:列表中,使用tuple对第二列元素进行排序
temp2 = sorted(List, key=lambda x:x[1])
# print('temp1: \n',temp1)
# print(temp2)
matrix_temp1 = np.array(temp1)
# print('matrix_temp1: \n',matrix_temp1)
temp1_nrows = matrix_temp1.shape[0]
# print(temp1_nrows)
G=nx.Graph(List)
# pos = nx.spring_layout(G)
de = G.degree()
# 下面是对无序Label做处理,并指定节点显示名称
temp = sorted(de.keys())
a = []
for j in temp:
i = temp.index(j)
a.append((i,j))
# print('a:',a)
matrix_a = np.array(a)
# print(matrix_a)
a_nrows = matrix_a.shape[0]
# print(a_nrows)
# print(matrix_a)
for i in range(a_nrows):
for j in range(temp1_nrows):
if matrix_a[i][1] == matrix_temp1[j][0]:
matrix_temp1[j][0]=matrix_a[i][0]
# print(matrix_temp1)
matrix_temp3 = matrix_temp1[np.lexsort(matrix_temp1.T)]
# print(matrix_temp3)
temp3_nrows = matrix_temp3.shape[0]
# print(temp3_nrows)
for i in range(a_nrows):
for j in range(temp3_nrows):
if matrix_a[i][1] == matrix_temp3[j][1]:
matrix_temp3[j][1] = matrix_a[i][0]
# print(matrix_temp3)
# 将matrix_temp3里的数据类型改为tuple
tt = [tuple(each) for each in matrix_temp3]
print(tt)
# tt为处理后的数据
G=nx.Graph(tt)
pos = nx.spring_layout(G)
de = G.degree()
print(de)
# 指定前三个显示名称
array = np.zeros(157)
j = 0
for i in range(len(de.keys())):
print("key", i, "value:",de[i])
array[j] = de[i]
j+=1
arg = np.argsort(-np.array(array))
print("arg:",arg)
labels = {}
pp = ['NRAS','NAE1','HRAS']
for index in range(3):
labels[arg[index]] = pp[index]
# de2下面赋给节点大小
de2 = [de[v]*8 for v in sorted(de.keys(), reverse=False)]
nx.draw_networkx_labels(G,pos,labels, font_size=6,font_color='white')
nx.draw_networkx(G, pos, node_size=de2, with_labels = False, node_color='#A52A2A', linewidths=None, width=1.0, edge_color ='#858585')
plt.savefig("Network.pdf")
plt.show()
结果
浏览器兼容
- 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
- IE9以下不支持
- IE9,10,11存在以下问题
- 不支持离线功能
- IE9不支持文件导入导出
- IE10不支持拖拽文件导入