作者:叶庭云     编辑:Lemon      出品:Python数据之道

一、NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。Networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。用于分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。

PS:本文所使用的数据源以及代码文件,可以在文末获取

二、NetworkX 的安装

pip install networkx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

三、NetworkX 基础知识

1. 创建图

可以利用 networkx 创建四种图:Graph 、DiGraph、MultiGraph、MultiDiGraph,分别为无多重边无向图、无多重边有向图、有多重边无向图、有多重边有向图。

import network as nx

G = nx.Graph()

G = nx.DiGraph()

G = nx.MultiGraph()

G = nx.MultiDiGraph()

2. 网络图的加点和加边

import networkx as nx

import matplotlib.pyplot as plt

G = nx.DiGraph()

G.add_node('z') # 添加节点z

G.add_nodes_from([1, 2, 3]) # 添加节点 1 2 3

G.add_edge('x', 'y') # 添加边 起点为x 终点为y

G.add_edges_from([(1, 2), (1, 3), (2, 3)]) # 添加多条边

# 网络图绘制与显示

nx.draw(G, with_labels=True)

plt.show()

运行效果如下:为了让网络图更美观可以调节 nx.draw() 方法里的参数

nx.draw(G, pos=nx.random_layout(G), node_color = 'b', edge_color = 'r', with_labels = True, font_size =18, node_size =20)

  • G:待绘制的网络图G

  • node_size:指定节点的尺寸大小(默认是300)

  • node_color: 指定节点的颜色 (可以用字符串简单标识颜色,例如'r'为红色,'g'为绿色这样)

  • node_shape: 节点的形状(默认是圆形,用字符串'o'标识)

  • alpha: 透明度 (默认是1.0,不透明,0为完全透明)

  • width: 边的宽度 (默认为1.0)

  • edge_color: 边的颜色(默认为黑色)

  • style: 边的样式(默认为实现,可选:solid | dashed | dotted | dashdot

  • with_labels:节点是否带标签

  • font_size: 节点标签字体大小

  • font_color: 节点标签字体颜色(默认为黑色)

3. 运用布局

circular_layout:节点在一个圆环上均匀分布 random_layout:节点随机分布 shell_layout:节点在同心圆上分布 spring_layout:用 Fruchterman-Reingold 算法排列节点(样子类似多中心放射状) spectral_layout:根据图的拉普拉斯特征向量排列节点绘制网络图实例如下:

import networkx as nx

import matplotlib.pyplot as plt

# 初始化一个有向图对象

DG = nx.DiGraph()

DG.add_node('X')

# 添加节点 传入列表

DG.add_nodes_from(['A', 'B', 'C', 'D', 'E'])

print(f'输出图的全部节点:{DG.nodes}')

print(f'输出节点的数量:{DG.number_of_nodes()}')

# 添加边 传入列表 列表里每个元素是一个元组 元组里表示一个点指向另一个点的边

DG.add_edges_from([('A', 'B'), ('A', 'C'), ('A', 'D'), ('D', 'A'), ('E', 'A'), ('E', 'D')])

DG.add_edge('X', 'C')

print(f'输出图的全部边:{DG.edges}')

print(f'输出边的数量:{DG.number_of_edges()}')

# 可自定义节点颜色

colors = ['pink', 'blue', 'green', 'yellow', 'red', 'brown']

# 运用布局

pos = nx.circular_layout(DG)

# 绘制网络图

nx.draw(DG, pos=pos, with_labels=True, node_size=200, width=0.6, node_color=colors)

# 展示图片

plt.show()

运行效果如下:

输出图的全部节点:['X', 'A', 'B', 'C', 'D', 'E']

输出节点的数量:6

输出图的全部边:[('X', 'C'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('D', 'A'), ('E', 'A'), ('E', 'D')]

输出边的数量:7

四、利用 NetworkX 实现关联类分析

利用 soccer.csv 中的数据,使用 Python 的 NetworkX 包按要求进行绘图。

1. 提取数据

统计不同俱乐部(Club)的球员数量,从球员最多的五个俱乐部抽取 50 名球员信息(球员数量最多的俱乐部抽取 30 名,剩下 4 个俱乐部各抽取 5 名)构成新的 DataFrame,打印其 info()。

import pandas as pd

df = pd.read_csv('soccer.csv', encoding='gbk')

data = df['Club'].value_counts()

# 球员人数最多的5个俱乐部

clubs = list(data.index[:5])

# 球员数量最多的俱乐部抽取30名

df1 = df[df['Club'] == clubs[0]].sample(30, axis=0)

# 剩下4个俱乐部各抽取5名

df2 = df[df['Club'] == clubs[1]].sample(5, axis=0)

df3 = df[df['Club'] == clubs[2]].sample(5, axis=0)

df4 = df[df['Club'] == clubs[3]].sample(5, axis=0)

df5 = df[df['Club'] == clubs[4]].sample(5, axis=0)

# 合并多个DataFrame

result = pd.concat([df1, df2, df3, df4, df5], axis=0, ignore_index=True)

# 打乱DataFrame顺序

new_result = result.sample(frac=1).reset_index(drop=True)

# new_result.info()

# 抽样的数据保存到excel

new_result.to_excel('samples.xlsx')

Jupyter Notebook 环境中读取 samples.xlsx,打印其 info(),结果如下:

import pandas as pd

df = pd.read_excel('samples.xlsx')

df.info()

2. 画网络图

在提取出的数据的基础上,通过判断球员是否属于同一俱乐部,绘出随机分布网络图、Fruchterman-Reingold 算法排列节点网络图与同心圆分布网络图。尽可能让网络图美观,如为属于同一俱乐部的节点设置相同的颜色。将每个球员当作网络图中一个节点,计算节点之间的连通关系,同属一个俱乐部则连通。

import pandas as pd

df = pd.read_excel('samples.xlsx')

df = df.loc[::, ['Name', 'Club']]

print(df['Club'].value_counts())

datas = df.values.tolist()

name = [datas[i][0] for i in range(len(datas))]

nodes = [str(i) for i in range(len(datas))]

club = [datas[i][1] for i in range(len(datas))]

# print(nodes)

df = pd.DataFrame({'姓名': name, '节点编号': nodes, '所属俱乐部': club})

df.to_csv('nodes_info.csv')

with open('record.txt', 'w') as f:

for i in range(len(nodes)):

for j in range(i, len(nodes) - 1):

if datas[i][1] == datas[j+1][1]: # 属于同一俱乐部

f.write(f'{nodes[i]}-{nodes[j + 1]}-{datas[i][1]}'+ '\n')

(1) 随机分布网络图

import networkx as nx

import matplotlib.pyplot as plt

import pandas as pd

from collections importCounter

df = pd.read_csv('nodes_info.csv')['所属俱乐部']

items = df.values

print(Counter(items))

node_colors = []

# 5个俱乐部 属于同一个俱乐部的节点设置相同颜色

for item in items:

if item == 'Free Agents':

node_colors.append('red')

elif item == 'Real Madrid':

node_colors.append('yellow')

elif item == 'Chelsea':

node_colors.append('blue')

elif item == 'FC Barcelona':

node_colors.append('green')

elif item == 'Manchester Utd':

node_colors.append('pink')

DG = nx.MultiGraph()

DG.add_nodes_from([str(i) for i in range(0, 50)])

DG.nodes()

with open('record.txt', 'r') as f:

con = f.read().split('\n')

edges_list = []

for i in con[:-1]:

edges_list.append(tuple(i.split('-')[:2]))

print(edges_list)

DG.add_edges_from(edges_list)

# 运用布局

pos = nx.random_layout(DG) # 节点随机分布

# 绘制网络图

nx.draw(DG, pos, with_labels=True, node_size=200, width=0.6, node_color=node_colors)

# 显示图片

plt.show()

运行效果如下:

(2) Fruchterman-Reingold 算法排列节点网络图

import networkx as nx

import matplotlib.pyplot as plt

import pandas as pd

from collections importCounter

df = pd.read_csv('nodes_info.csv')['所属俱乐部']

items = df.values

print(Counter(items))

node_colors = []

# 5个俱乐部 属于同一个俱乐部的节点设置相同颜色

for item in items:

if item == 'Free Agents':

node_colors.append('red')

elif item == 'Real Madrid':

node_colors.append('yellow')

elif item == 'Chelsea':

node_colors.append('blue')

elif item == 'FC Barcelona':

node_colors.append('green')

elif item == 'Manchester Utd':

node_colors.append('pink')

DG = nx.MultiGraph()

DG.add_nodes_from([str(i) for i in range(0, 50)])

DG.nodes()

with open('record.txt', 'r') as f:

con = f.read().split('\n')

edges_list = []

for i in con[:-1]:

edges_list.append(tuple(i.split('-')[:2]))

print(edges_list)

DG.add_edges_from(edges_list)

# 运用布局

pos = nx.spring_layout(DG) # 用Fruchterman-Reingold算法排列节点(样子类似多中心放射状)

# 绘制网络图

nx.draw(DG, pos, node_size=10, width=0.6, node_color=node_colors)

# 显示图片

plt.show()

运行效果如下:

(3) 同心圆分布网络图

import networkx as nx

import matplotlib.pyplot as plt

import pandas as pd

from collections importCounter

df = pd.read_csv('nodes_info.csv')['所属俱乐部']

items = df.values

print(Counter(items))

node_colors = []

# 5个俱乐部 属于同一个俱乐部的节点设置相同颜色

for item in items:

if item == 'Free Agents':

node_colors.append('red')

elif item == 'Real Madrid':

node_colors.append('yellow')

elif item == 'Chelsea':

node_colors.append('blue')

elif item == 'FC Barcelona':

node_colors.append('green')

elif item == 'Manchester Utd':

node_colors.append('pink')

DG = nx.MultiGraph()

DG.add_nodes_from([str(i) for i in range(0, 50)])

DG.nodes()

with open('record.txt', 'r') as f:

con = f.read().split('\n')

edges_list = []

for i in con[:-1]:

edges_list.append(tuple(i.split('-')[:2]))

print(edges_list)

DG.add_edges_from(edges_list)

# 运用布局

pos = nx.shell_layout(DG) # 节点在同心圆上分布

# 绘制网络图

nx.draw(DG, pos, with_labels=True, node_size=200, width=0.6, node_color=node_colors)

# 显示图片

plt.show()

运行效果如下:为方便大家练习,可以在公号「Python数据之道」后台回复 “网络图” 获取本文的数据和源代码文件。

作者简介

叶庭云

个人格言: 热爱可抵岁月漫长

CSDN博客: https://blog.csdn.net/fyfugoyfa/

---------End---------

往期精彩回顾

适合初学者入门人工智能的路线及资料下载

机器学习及深度学习笔记等资料打印

机器学习在线手册

深度学习笔记专辑

《统计学习方法》的代码复现专辑

AI基础下载

机器学习的数学基础专辑

python画圆形螺旋线_【Python基础】利用 Python 搞定精美网络图!相关推荐

  1. python画圆形螺旋线_硬核教程,利用 Python 搞定精美网络图!

    硬核教程, 利用 Python 搞定精美网络图! 一.NetworkX 概述 NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进 ...

  2. python画圆形螺旋线_这个Python项目,一秒生成可爱像素风图片

    本文转自:量子位,作者郭一璞整理来自:大邓和他的 Python像文字云一样,用各种小图拼出大的图片,构建一个像素风的世界,就像<我的世界>里一样,一定非常有趣.还可以拿来做拼贴画.十字绣等 ...

  3. python画圆形螺旋线_如何用Python画一只机器猫?

    作者 | 人邮异步社区 责编 | 胡巍巍 出品 | CSDN博客 自信心是成功的源泉,对刚入门编程行业的初级程序员来说,多敲代码多做项目就是构建自信心的最好办法. 第一次学编程是在屏幕上敲出" ...

  4. python画圆形螺旋线_用Python写一首中秋Rap

    中秋节马上就要到啦 各位小伙伴是不是 已经按捺不住激动的心情 心情早已飞到家里/旅游目的地 (此条屏蔽领导) 在写这篇文章之前 小编在网上 已经看到了许多关于 中秋节的各种段子和诗句 看到一些什么&q ...

  5. python画圆形螺旋线_用Python一秒生成复古像素图片

    本文转自:量子位,作者郭一璞整理来自:大邓和他的 Python像文字云一样,用各种小图拼出大的图片,构建一个像素风的世界,就像<我的世界>里一样,一定非常有趣.还可以拿来做拼贴画.十字绣等 ...

  6. python画圆形螺旋线_宝宝爱看小猪佩奇,很简单,让我们用python搞定它

    现在很多宝宝喜欢看小猪佩奇,今天就教大家用python的海龟画图画一个乖巧萌萌的小猪佩奇,引导对编程产生浓浓 的兴趣. 画图前引导 1.让我们打开百度,输入python进入python官网 2.在官网 ...

  7. python画圆形螺旋线_中秋节到了,送你一个Python做的Crossin牌“月饼”

    明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个"月饼"--当然这个月饼是不能吃的,因为它是用python做的.先给大家看一下效果图. 图1. 月饼 ...

  8. python画圆形螺旋线-Python使用matplotlib绘制三维图形示例

    本文实例讲述了Python使用matplotlib绘制三维图形.分享给大家供大家参考,具体如下: 用二维泡泡图表示三维数据 泡泡的坐标2维,泡泡的大小三维,使用到的函数 plt.scatter(P[: ...

  9. python画圆形螺旋线_PS画结构素描与示范-金属管道台灯(电脑绘画)

    本课程为零基础入门课程,想从零学习的请看前面的课程. 还有视频教程 今天画得是金属管道台灯,这节课是讲结构素描相关知识 有的结构素描会添加一点光影变化,这种画法也可以,看个人需求了. 首先确定四点,上 ...

最新文章

  1. 大量LAST_ACK 的分析过程
  2. hung-yi lee_p13_反向传播
  3. 设置虚拟工作空间_建筑狂想曲 | 建筑学习生活空间虚拟设计工作营最终评图
  4. Spring boot 文件上传大小限制
  5. 关于Jstree节点显示无法收缩的解决办法
  6. 关于Orchard CMS
  7. 凭什么,Netty能成为最流行的NIO框架?
  8. RegCloseKey函数
  9. SVN报错之Failed to run the WC DB work queue associated with...的处理方法
  10. Android 教你打造炫酷的ViewPagerIndicator
  11. PeopleRank从社交网络中发现个体价值
  12. 龙华大浪注塑加工中模具原理及组成
  13. android 当电脑屏幕,手机变身为电脑的第二屏幕?让你把手机当成电脑用!
  14. matlab2015使用dsolve错误,matlab - 当变量乘以常数时,dsolve中的错误(R2011a) - 堆栈内存溢出...
  15. matlab中功率因数模块,最经典的功率因数控制器设计方案
  16. mysql基于amoeba读写分离
  17. android延迟时间设置,控制Android上的延迟
  18. 战舰少女r服务器维修,战舰少女r修理时间怎么计算?舰船受损维修时间公式分析[多图]...
  19. onload 属性的作用
  20. Excel之用Sumifs完成多条件多列的求和

热门文章

  1. rtl8812驱动分析(二)
  2. C语言中alarm的应用
  3. 6-3 选队长 (5 分)
  4. cefsharp内嵌资源html的读取,C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源...
  5. 华盛顿大学西雅图 计算机科学 申请条件,华盛顿大学西雅图分校申请有哪些条件...
  6. maven 引用其他项目引用的包出现BOOT-INF问题
  7. pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
  8. 岁月温柔-21 妈妈转到省医院第2天
  9. TextOut 字符串输出
  10. 阮一峰访谈问题有奖征集