前言:研究生期间主要做复杂网络聚类,也称为社区检测。临毕业前,老师让之前发表的论文里的算法代码C化,并写出界面进行可视化。由于之前虽然做过可视化,但基本上都是将聚类结果导入到pajek或者gephi这类专门的软件里进行绘制的。想要将社区检测结果实时的进行绘制并且要通过C\C++直接绘制,确实没有什么头绪。后来,通过浏览博客知道igaph这个包可以使用,由于想要熟悉下python,于是选择了Python的igraph包,而放弃使用C语言的igraph包。这样,我就可以将算法产生的聚类结果直接导入Python代码,并利用Python的igraph包进行网络划分结果的绘制。然后,再用C++调用Python代码,并将Python产生的聚类结果图直接加载到MFC中,这样就能实现实时地对社区检测结果进行绘制。

        一. 利用Python进行网络聚类图的绘制

当然我们需要实现安装Python和igraph包。本人使用的系统是win7系统,安装的软件是anaconda,内含Python2.7版本,基本上需要的东西anaconda都集成好了,一键安装很是方便。

其次,我们需要安装python-igraph包。这是官方网址。直接使用pip安装会出现问题(Windows系统本身的问题),因此本人选用的非官方网址的安装包,见这里。这个网址在官网也提供了,一定要选对对应的版本。Python3.6以上的版本好像并没有对应的igraph包,因此安装的时候会出现平台不支持的提示。然后在dos系统环境下pip install 安装包,即可实现igraph的安装。

接下来,我们还需要安装支持igraph绘制图形的Cairo库。这个库同样在上面提供的非官方网址上可以找到,下载对应系统的版本,并进行pip安装即可。这里不再详细介绍。

前提工作做好,接下里进行网络社区图的绘制。如果不熟悉igraph包的使用,可以参见官网的使用手册。里面也有关于网络图绘制的介绍。下面给出相关代码:

# Python 2.7
from igraph import *
from PIL import Imagecolors_type = ["yellow", "red", "green", "coral", "alice blue", "cyan", "pink",
"gray", "blue", "green yellow", "orange", "light blue", "hot pink", "light green", "gold"]def PlotNetworks(net_file, detected_label, real_label = "Unknown Type"):## read filesnetwork = Graph.Read_Adjacency(net_file)Graph.to_undirected(network)f1 = open(detected_label)line = f1.readline()line = line.strip()str_line = line.split('\t')dlabel = [int(ele) for ele in str_line]network.vs["dlabel"] = dlabelif(real_label != "Unknown Type"):f2 = open(real_label)line = f2.readline()line = line.strip()str_line = line.split('\t')rlabel = [int(ele) for ele in str_line]network.vs["rlabel"] = rlabel# plot networksnnodes = len(network.vs)network.vs["name"] = [str(i+1) for i in range(nnodes)]layout = network.layout("drl")visual_style = {}if(nnodes < 100):visual_style["vertex_size"] = 22else:visual_style["vertex_size"] = 18visual_style["vertex_label"] = network.vs["name"]visual_style["layout"] = layoutvisual_style["bbox"] = (500,500)visual_style["margin"] = 20visual_style["edge_curved"] = 0.3visual_style["vertex_color"] = [colors_type[i-1] for i in network.vs["dlabel"]]plot(network, "social_network1.png", **visual_style)figure1 = Image.open("social_network1.png")figure1.save("social_network1.bmp")if(real_label != "Unknown Type"):visual_style["vertex_color"] = [colors_type[i-1] for i in network.vs["rlabel"]]plot(network, "social_network2.png", **visual_style)figure2 = Image.open("social_network2.png")figure2.save("social_network2.bmp")

代码写的稍微有些繁琐,主要是为了之后C++代码的调用方便。函数需要三个参数,均为文件路径名。第一个文件是复杂网络的邻接矩阵,我们可以使用Graph.Read_Adjacency()来直接读取,不过这个方法默认读取的是有向网络,而我使用的均是无向网络,所以需要使用Graph.to_undirected()将其转换为无向网络。第二个文件为算法的聚类结果文件,文件是由1-k个整数标签表示社区检测结果,k表示一共检测到k个社区。第三个文件表示真实的网络划分结果,对于有些网络,我们往往并不知道真实的网络划分结果,这里是一个可选文件。

接着,绘制网络的可视化效果参数。使用字典可以直接将可视化参数设置好,这里我们用visual_style来表示。相关参数均可以在上述提供的官方手册找到。其中着重介绍下visual_style["layout"]这个参数,它是一种网络的布局算法,熟悉pajek软件的同学对这个参数应该也有所了解。其中“drl”是大图的分布式递归布局算法,常用的还有“kk”,“fr”等,这些都能使自己的网络节点布局合理,比较美观。由于这些参数都是非确定型的绘图方式,也就是说,每次节点的布局都会有所差异。更多参数见官网手册。

这里的color_style给了很多颜色,因为后期要绘制美国大学生足球队网络,需要至少12种颜色,这里Wikipedia提供了多达上百种的颜色,只需要将颜色的首字母小写即可。最后需要说明一下,由于我的MFC代码里需要调用bmp图像,而plot不能存储为bmp格式,这里多了一步将png转换为bmp格式的过程。

下面给出MFC界面绘制社区检测效果图,图像绘制如下:

1、Zachary's karate network(即跆拳道网络):

2、dolphin social network

3、American football network

这里为了突出检测图和真实图的区别,故意选择了效果一般时的参数。勿介意(手动滑稽)。。。

二、MFC调用Python代码

前面已经给出了绘制社区检测效果图的代码。这里简单介绍下怎样使用C++代码调用Python代码。这篇【博客】基本实现了vs配置使用C++调用python代码,这里需要强调几点:第五步应该在第三步之前进行实施,因为我配置完第五步之后,发现原先配置好的第三步又变回了原始配置,所以我们可以先配置第五步再接着配置第三步;此外,由于我们安装的是anaconda,所以我们需要在anaconda的相关文件下找到include目录和libs目录,并进行配置而非Python27目录,其他不需要改变。这样我们就可以配置好vs环境。

下面代码实现了C++调用Python代码:

void callPython(char *str1, char *str2, char *str3)
{
    Py_Initialize();    PyObject *pModule = NULL;
    PyObject *pFunc = NULL;
    pModule = PyImport_ImportModule("PlotNetworks");
    pFunc = PyObject_GetAttrString(pModule, "PlotNetworks");
    PyObject *pArgs = PyTuple_New(3);
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", str1));
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", str2));
    PyTuple_SetItem(pArgs, 2, Py_BuildValue("s", str3));
    PyEval_CallObject(pFunc, pArgs);
    Py_Finalize();
}

str1, str2, str3就是我们Python代码里所需要的三个文件,PyImport_ImportModule()调用的是我们的python文件名,下面的函数调用“PlotNetworks”

是python代码内的函数名。这里的pArgs对应Python里的一个元组,下面的参数“s”表示该参数是字符串类型。通过pArgs可以实现将参数传递给pFunc。

这篇【博客】可以进行参考。最后,在使用MFC绘制网络图的时候,发现了一个问题。即当我第二次选择文件时,在点击聚类就会出现问题,提示显示

python调用那一块出现问题。找了一些资料,发现Py_Initialize()和Py_Finalize()在一个程序中不能多次使用,原因是Py_Initialize初始化的占用的内存并

不能被Py_Finalize()完全释放(大概是这个意思)。于是我将这两个函数分开来,一个放在MFC窗口的初始化中,一个放在关闭窗口的消息函数中,最

终解决了这个问题。

结束语:写这个博客的原因一方面为了记录下这几天的工作,另一方面发现网上写R使用igraph包绘制复杂网络图的博客较多,对于Python绘制复

杂网络图的很少。于是写下这一篇博客,希望能为研究复杂网络的小伙伴提供一些思路。

Python利用igraph绘制复杂网络聚类(社区检测)结果图相关推荐

  1. python画聚类图、并且把聚类图保存起来_Python利用igraph绘制复杂网络聚类(社区检测)结果图-Go语言中文社区...

    前言:研究生期间主要做复杂网络聚类,也称为社区检测.临毕业前,老师让之前发表的论文里的算法代码C化,并写出界面进行可视化.由于之前虽然做过可视化,但基本上都是将聚类结果导入到pajek或者gephi这 ...

  2. python 利用cartopy绘制世界地图中部分地区的风场的流线形式

    python 利用cartopy绘制世界地图中部分地区的风场的流线形式 先看效果图图(1982-1984 6.7.8月200hPa高度风场,60°E-150°E,0-40°N) 所用的画流线的函数 p ...

  3. python画三维立体图-Python 竟能绘制出如此酷炫的三维图

    原标题:Python 竟能绘制出如此酷炫的三维图 通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维 ...

  4. python怎样画立体图-Python 竟能绘制出如此酷炫的三维图

    原标题:Python 竟能绘制出如此酷炫的三维图 作者 | Jay Alammar 译者 | 高级农民工 通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: ...

  5. Python使用matplotlib绘制数据去重前后的柱状图对比图(在同一个图中显示去重操作之后同一数据集的变化情况)

    Python使用matplotlib绘制数据去重前后的柱状图对比图(在同一个图中显示去重操作之后同一数据集的变化情况) #仿真数据 import pandas as pd import numpy a ...

  6. 用matlab对称振子E面方向图,利用matlab绘制电基本振子e面方向图和空间立体方向图.doc...

    利用matlab绘制电基本振子e面方向图和空间立体方向图.doc 微波技术与天线实验报告学院:信电学院班级:通信2班姓名:学号:2014年4月29日1利用matlab绘制电基本振子E面方向图和空间立体 ...

  7. python基本图形绘制_【Python】Python基本图形绘制-Go语言中文社区

    1.Python蟒蛇图形绘制: 代码: #PythonDraw.py import turtle turtle.setup(650, 350, 200, 200) turtle.penup() tur ...

  8. python绘制动态图-Python利用Echarts绘制动态交互图:快速入门

    我们都知道,Echarts是百度开源的超强大的数据可视化工具.Python中经典的matplotlib.seaborn等库相比,它最大的优点是所绘制的图形为动态图,这意味着我们可以和图形之间进行动态的 ...

  9. python绘制3d图形-万万没想到,Python 竟能绘制出如此酷炫的三维图

    作者 | Jay Alammar 译者 | 高级农民工 通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制 ...

最新文章

  1. Atomic原子类常用方法总结(包含四大类型)
  2. IOS设置导航栏返回按钮,并添加事件返回主页面
  3. 在.NET Core 3.0中发布单个Exe文件(PublishSingleFile)
  4. java中,剩下的这两个内部类不太好理解!
  5. 8位16进制频率计设计实验--VHDL
  6. 关于ssh的一篇很好的文章
  7. 如何在 Mac 上的程序坞中使用文件夹?
  8. 《HTML与CSS入门经典(第8版)》——2.5 测试Web内容
  9. 谈谈成功,你离成功有多远?施瓦辛格励志演讲分享(配中文翻译)
  10. 自动锁定计算机软件,教你电脑锁屏怎么设置,让电脑自动锁屏
  11. 3D变电站园区3D可视化电力监控管理平台
  12. IntelliJ IDEA - 闪退解决方案
  13. 需求分析详细设计概要设计说明书部分样本
  14. TeeChart界面元素使用说明(区域填充、Marks、Annotation)
  15. webpack打包react项目步骤
  16. Hznu_0j 1557
  17. 真服了!docker源码分析孙宏亮
  18. 如何使用PowerPoint制作精美的PPT
  19. 解决brew: Warning: Unexpected method ‘arch‘ called on Cask portfolioperformance.
  20. Unity3D学习之(游戏商城项目解析)

热门文章

  1. 三种线程安全的List
  2. [计算机网络]应用层协议,HTTP,SMTP,DNS
  3. Halcon捕捉错误的方式(tray catch)
  4. 控制鼠标随机点击,电脑不锁屏!
  5. 清华AI蛋白质结构预测,连续4周夺得CAMEO第一
  6. js java 中文乱码_编码问题(.java/.jsp/.js等文件的中文乱码)
  7. Matlab Appdesigner界面设计基本用法
  8. xtu寒假做题1月7日题解
  9. 漫步者 TWS1 蓝牙配对
  10. 【ARM】使用Busybox构建根文件系统