硬核教程, 利用 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()

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

-END-


扫码添加早小起,进入Python技术交流群

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

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

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

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

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

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

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

  4. python画圆形螺旋线_【Python基础】利用 Python 搞定精美网络图!

    作者:叶庭云     编辑:Lemon      出品:Python数据之道 一.NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂 ...

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

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

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

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

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

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

  8. python画圆形螺旋线-Python turtle 绘制彩色螺旋线

    小朋友总会别各种五颜六色的色彩所吸引,就拿小编的小侄子来说,自己很喜欢美术课,看到五颜六色的颜色都想尝试着图一下,但结果总是不仅人意,今天南京小码王Python培训机构,就为大家介绍一下Python ...

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

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

最新文章

  1. cudnn 安装失败_Win10下安装tensorflow环境的一些坑
  2. springmvc-返回值
  3. java开发错误_每个Java开发人员都必须避免的9个安全错误
  4. Java语言与sikuli配合
  5. android httpclient 乱码,【问题解决】HttpClient解析服务器返回的response出现乱码
  6. 安装10gR2的硬件要求
  7. php正则表达式小括號,php使用正則表達式提取字符串中尖括號、小括號、中括號、大括號中的字符串...
  8. 系统同传软件_影视翻译软件可实时在线翻译多国语言
  9. 如何监测土壤pH值和水分含量
  10. ICO 图标快速制作
  11. 网页分享至Facebook,Twitter,LinkedIn,WhatsApp,邮箱总结
  12. [MySQL学习] Innodb锁系统(4) Insert/Delete 锁处理及死锁示例分析
  13. Java DateUtil 时间工具类
  14. w ndows7太卡了,uefi安装win7卡在正在启动windows界面解决方法(新方法)
  15. Druid连接池耗尽问题排查总结
  16. 怎么调用接口发国际验证码和通知短信?
  17. application实现一个简单的网页计数器
  18. SuperMap iClient3D for WebGL教程 粒子特效-基础火焰特效
  19. C语言的文件读写操作
  20. 【实战】OceanBase之OMS迁移Oracle至oceanbase

热门文章

  1. javascript解析json字符串,各种格式分析
  2. c51抢答器程序汇编语言,单片机八路抢答器proteus仿真带汇编语言源程序 原理图...
  3. matlab鱼眼镜头矫正
  4. 解释词超文本标记语言html,超文本标记语言html的解释
  5. java 工厂方法_java设计模式-工厂方法模式
  6. WPF 动态加载DataGrid
  7. 什么是DDoS×××?DDoS防御的11种方针详解
  8. 在线JSON转PlainText工具
  9. CSS 滚动条始终默认显示和修改placeholder的默认颜色
  10. java生成word文档freemarker