暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

图网络可视化Python新包

AI2ML人工智能to机器学习 2021-10-28
611

前言


如果你有海量的图数据, 那么你想抽样可视化, 有个展示的神器叫Gephi,在各个平台可以下载应用。https://gephi.org/ 现在已经发展到0.9.2的版本了,非常的好用。 



但是要是你的数据是如下的表数据, 那么你咋整?


,source-id,source-type,destination-id,destination-type,edge-type,graph-id
0,4,a,5,c,p,0
1,4,a,6,c,p,0
2,4,a,7,c,p,0
3,4,a,8,c,p,0
4,4,a,9,c,j,0


当然, Gephi也支持CSV的直接输入, 但是CSV输入的可视化支持的并不好。那么你可以看一下, Gephi支持了如下格式。 其中可视化做的好的格式有:

  1.  GEXF

  2.  GraphML

  3.  GML

  4.  DOT Graphviz

  5.  GDF

  6.  NET Pajek



当然, 肯定推荐你首选GEXF格式。 那问题是如何把CSV的文件转换成GEXF格式呢?



GEXF格式


GEXF (Graph Exchange XML Format) 是非常好的图表示格式, 目前

  1. NetworkX (https://networkx.org/documentation/stable/reference/readwrite/gexf.html),也把它作为首选格式之一。 

  2. Echart 也支持GEXF格式。 


并且Gephi支持的1.2 draft格式还支持动态的特征(Network and data dynamics)。这个特性几乎是其他大部分格式不支持的。 

XML Schema 1.2draft

  • Basic graph: RNC | RNG | XSD

  • Associated data: RNC | RNG | XSD

  • Network and data dynamics: RNC | RNG | XSD

  • Hierarchy structure: RNC | RNG | XSD

  • Phylogeny structure: RNC | RNG | XSD

  • Visualization: RNC | RNG | XSD


那有什么好的工具可以把CSV转换成GEXF格式么?


有个陈旧的Python封装支持, 但是这个包已经是11年前的了, 并且不支持python3.  而且没有用例, 如何能支持颜色标定与动态呢?


https://github.com/paulgirard/pygexf



基于GEXF XSD建XML


利用XSD的浏览器, https://xmlgrid.net/view/xsdViewer.html 打开GEXF的XSD文件, 弄明白XSD的类别要求。 



然后基于, XML 的python包  参考

https://wiki.python.org/moin/PythonXml


可以用lxml, 或者minidom, 自己慢慢组装。 这个过程稍微有点痛苦, 需要理解XSD的结构。 



需要复杂的组装, 而且没有任何Python类型提示。



并且代码冗长。不是很方便维护。 有没有更好的办法?


重建GEXF Python包


既然GEXF有完整的XSD, 一个很直观的办法就是把这些XSD, 转换成为Python 类,不就搞定了。 


找到3个非常经典的包:PyXB, generateDS, xsdata.


pip install PyXB

Successfully installed PyXB-1.2.6


pip install generateDS

Successfully installed generateDS-2.40.5


pip install xsdata[cli,lxml,soap]

Successfully installed click-default-group-1.2.2 docformatter-1.4 toposort-1.7 untokenize-0.1.1 xsdata-21.9


经过认证的测试, 发现generateDS,xsdata都可以。  xsdata对python3.7的语法支持更好。 优先选择了 xsdata。


有兴趣的可以自己去试试:


python generateDS.py -o gexf.py -s gexf_app1.py  --member-specs=dict gexf_1.2_xsd/gexf.xsd


xsdata gexf_1.2_xsd/gexf.xsd --package gexfpy.gexf


但是不管是generateDS 还是  xsdata, 生成了Python类之后,都是需要手动调整的。 



封装发布 GEXFpy 包


因为pygexf的名字已经被占用了, 因此选用GEXFpy的名字进行封装。 



完成代码之后, 进行pypi注册提交。 


步骤一:pypi注册,获取用户名密码


https://pypi.org/


步骤二:把密码写入.pypirc文件方便访问

.pypirc

---------------------------------------------------------------

.................................................................................................................

[distutils]


index-servers=pypi


[pypi]


repository=https://upload.pypi.org/legacy/

username=chunqishi

password=xxxxxxxxx

.................................................................................................................

---------------------------------------------------------------


步骤三:buid,dist, upload


python setup.py sdist build

python setup.py bdist_wheel --universal


upload 既可以直接用setup.py 也可以用 twine。twine效果更好一些,推荐。 


python setup.py sdist upload

pip install twine

twine upload dist/*


最后发布完成。



https://pypi.org/project/gexfpy/


测试比较使用GEXFpy


步骤一:安装GEXFpy


pip install gexfpy -i https://pypi.tuna.tsinghua.edu.cn/simple


步骤二: 测试对比


同样的内容, 通过GEXFpy来实现, 代码量变小很多很多。





而且整个过程都有类型提示,书写便捷很多。 


对于这个比较有兴趣,可以参考:GEXFpy源码的Examples。


https://github.com/chunqishi/gexfpy/tree/main/examples


尤其通过matplotlib来进行动态分配颜色,真心非常方便:





效果展示


最终大家可以看到最终的效果,如下:


最后我们再回顾一下具体步骤:


  1.  使用pandas读取了CSV

  2.  按节点、边使用GEXFpy来进行封装Gexf

  3.  使用matplotlib的colormap对节点进行动态分配颜色

  4.  使用GEXFpy对Gexf对象进行XML序列化

  5.  使用Gephi进行可视化


当然, 你也可以把别人的Gexf 读取进来,进行数据提取, 修改, 再进行输出。  如果是这样一个流程, 那么没有GEXFpy的帮忙, 整个工作量就大了。 


如果您想使用, 请参考:

https://pypi.org/project/gexfpy/


也欢迎各位继续帮忙改进:

https://github.com/chunqishi/gexfpy

文章转载自AI2ML人工智能to机器学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论