前言
如果你有海量的图数据, 那么你想抽样可视化, 有个展示的神器叫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支持了如下格式。 其中可视化做的好的格式有:
GEXF
GraphML
GML
DOT Graphviz
GDF
NET Pajek

当然, 肯定推荐你首选GEXF格式。 那问题是如何把CSV的文件转换成GEXF格式呢?
GEXF格式
GEXF (Graph Exchange XML Format) 是非常好的图表示格式, 目前
NetworkX (https://networkx.org/documentation/stable/reference/readwrite/gexf.html),也把它作为首选格式之一。
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来进行动态分配颜色,真心非常方便:

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

最后我们再回顾一下具体步骤:
使用pandas读取了CSV
按节点、边使用GEXFpy来进行封装Gexf
使用matplotlib的colormap对节点进行动态分配颜色
使用GEXFpy对Gexf对象进行XML序列化
使用Gephi进行可视化
当然, 你也可以把别人的Gexf 读取进来,进行数据提取, 修改, 再进行输出。 如果是这样一个流程, 那么没有GEXFpy的帮忙, 整个工作量就大了。
如果您想使用, 请参考:
https://pypi.org/project/gexfpy/
也欢迎各位继续帮忙改进:
https://github.com/chunqishi/gexfpy




