独家 | 使用Gephi设置动态图形动画——在社会网络图中动画化时间动态行为的数据可视化教程

共 5960字,需浏览 12分钟

 ·

2021-06-07 08:56


作者:Haaya Naushan

翻译:车前子
校对:欧阳锦

本文约3300字,建议阅读7分钟

Gephi可视化Twitter网红的转发行为随时间的变化。



谈到分析社交网络,我之前的文章主要是关于自然语言处理(natural language processing , NLP),或者更具体地说是阿拉伯语NLP。然而Tweet不仅仅是文本数据,它们代表Twitter用户之间的网络连接。添加网络分析,允许在社交媒体数据的内容和行为之间进行综合;因此,将网络和文本数据结合起来,就可以对社交媒体网络有更细致的理解。

我的Python学习之旅是出于需求而开始的,目标是使Twitter网络图生动起来,而编码似乎就是解决方案。因此,我的第一个脚本是与pandas的一场殊死搏斗——为了创建一个能在Gephi(一个流行的开源图形可视化软件)使用的简单csv。几个月后,阅读我最初的代码成了我的动力,改进第一个脚本成为了教我谦卑的功课。

最近,我在与世界银行的研究人员合作进行黎巴嫩调查时使用了改进后的脚本。在领域内知识和专业技术的指导下,我分析了一个Twitter标签“# لبنان_ينتفض”(译:黎巴嫩的崛起)。数据收集时间较长:始于2019年“十月革命”的第一次抗议活动,期间发生了2020年8月贝鲁特爆炸,直到2020年11月结束。

作为调查的一部分,我观察了Twitter网红的转发网络,有人建议我把注意力集中在特定时段,所以我最初的方法是创建静态快照。然而,数据的时间特性促使我将转发行为的时间动态可视化。多亏了我的第一个脚本,我能够使用最基本的Python和Gephi创建几个像上面例子那样的动画图形,。在那之后,我通过使用CloudApp创建屏幕截图gif,导出我的时间动态Twitter网络动画。

在这个简短的数据可视化教程中,我将概述创建网络数据动画所需的步骤和最简代码。我将以Twitter为例,但同样的过程也可以用于其他社交媒体网络。由于本教程的重点是数据可视化,因此我将跳过对数据收集过程的解释。尽管如此,我在“Twitter脚本抓取初学者知识要点分享”中介绍了如何收集本教程所需的数据。https://gist.github.com/haayanau/63d03cad7db813a3f77577038c3f0d5f


Gephi有几个选项用于从数据库加载网络数据,或者以图形文件格式(如.graphml,或 .gexf)加载网络数据。然而,对于动态图,最简单的选择是将数据从正确标记和格式化的电子表格加载到Gephi中。在网络图术语中,“节点”表示单个Twitter用户,“边”表示用户之间的转发连接。我从节点和边缘csv文件开始,这些文件是用Python中的networkx工具从未处理的原始Twitter数据创建的。这篇优秀的文章解释了如何开始可视化Twitter网络,包括如何使用networkx创建节点和边。

下面的代码片段显示了如何从节点和边csv文件加载Twitter数据,以便它们可以在Python中正确地标记和格式化。

1. import pandas as pd2. 3. data_dir = 'C:/your_data_dir/'4. 5. # load nodes csv to pandas dataframe6. df_nodes = pd.read_csv(data_dir + 'nodes.csv', low_memory=False)7. print(f"The nodes dataframe has shape {df_nodes.shape}")8. 9. # load edges csv to pandas dataframe 10. df_edges = pd.read_csv(data_dir + 'edges.csv', low_memory=False)11. print(f"The edges dataframe has shape {df_edges.shape}")

载入节点和边的csv文件的Python代码段。


加载原始Twitter数据后,先处理节点,然后处理边,并将两者保存为csv文件。

Gephi需要输入一个节点表格,第一列命名为“Id”,包含Twitter用户Id,第二列为“Label”,包含Twitter用户名。其他列都表示节点属性,可根据需求选择性录入。在下面的代码示例中,我纳入了一列Louvain集群(由Louvain社区检测算法得出,可在networkx中实现)和一列Twitter用户跟随者数。处理节点的最后一步是将节点数据帧保存为csv,以便以后将其导入Gephi。

1. # select necessary columns for list of nodes with attributes 2. df_nodes = df_nodes.loc[:, ['user_id', 'user_screen_name', 'cluster', 'user_followers_count']].drop_duplicates('user_id')3. print(f"This nodes dataframe has shape {df_nodes.shape}")4. 5. # Label "Id" and "Label" columns6. df_nodes['Id'] = df_nodes['user_id']7. df_nodes['Label'] = df_nodes['user_screen_name']8. # Arrange dataframe so first column is "Id" and second is "Label". All other columns are node attributes.9. df_nodes = df_nodes.loc[:, ['Id', 'Label', 'cluster', 'user_followers_count']]10. print(f"the first five rows of the nodes dataframe look like this {df_nodes.head(5)}")11. 12. # Save labeled and formatted nodes dataframe as a csv for Gephi13. df_nodes.to_csv(data_dir + 'nodes.csv', index=False, encoding='utf-8')
处理Gephi节点的Python代码段。

接下来,对于边数据的表格,与节点类似,Gephi导入时需要有特定的标记并对数据排序。前两个必需的列是“Source”和“Target”,表示参与转发的Twitter用户对。第三列是“Type”,在这个Twitter示例中设定为“directed”,因为我们处理的是转发数据。第四列是“Label”,在本例中是一个简单的索引。第五列是最重要的,命名为“Timeset”,包含转发的创建时间——注意是iso格式。“Timeset”列是时间变量,将用于在Gephi中设置网络图的动画。最后一列“Weight”是可选的,Gephi默认为“1”。最后,边数据帧可以保存为csv,以便导入Gephi。

1. # Label columns as "Source" and "Target"2. df_edges['Source'] = df_edges['retweeter']3. df_edges['Target'] = df_edges['retweetee']4. 5. # Add columns for type, weight and label6. df_edges['Type'] = 'directed'7. df_edges['Weight'] = 18. df_edges['Label'] = [i for i in range(1, df_edges.shape[0]+1)]9. 10. # Label the retweet time column "Timeset" and format time in isoformat11. df_edges['retweet_created_at'] = pd.to_datetime(df_edges['retweet_created_at'], utc=True)12. df_edges[r'Timeset'] = df_edges['retweet_created_at'].apply(lambda x: x.isoformat())13. print(f"the time is in this format {df_edges[r'Timeset'].head(3)}")14. 15. # Arrange edges dataframe and verify that the format is correct.16. df_edges = df_edges.loc[:, ['Source', 'Target', 'Type', 'Label', r'Timeset', 'Weight']]17. print(f"this dataframe has shape {df_edges.shape}")18. print(f"the first five rows look like this {df_edges.head(5)}")19. 20. # Save edges dataframe as csv for import into Gephi.21. df_edges.to_csv(data_dir + 'edges.csv', index=False, encoding='utf-8')
处理Gephi中边数据的Python代码段。

现在节点和边数据的电子表格已经格式化和标记了,可以通过“导入电子表格”菜单选项导入Gephi。从节点开始,下面的屏幕截图显示了第一个导入菜单,其中分隔符应为“逗号”,导入选项应为“节点表”,编码应为“UTF-8”。
 

节点的Gephi电子表格导入界面。

下一步是选择要导入的列并为属性列指定数据类型。注意在时间表示(Time representation)的下拉菜单中选择“Timestamps”,这对于以后导入时间戳边数据非常重要。


 节点导入过程通过将节点添加到新的Gephi工作区来完成

接下来,从“边”电子表格添加边数据。在下面的截图中看到的边导入过程与节点导入过程类似;唯一的区别是选择了“边表(Edges table)”的导入选项。

 Gephi电子表格导入边数据

下面的屏幕截图显示了第二个导入屏幕,其中我们将时间表示指定为“Timestamps”,并将“Timeset”列的数据类型指定为“TimestampSet”。
 


边数据导入过程的最后一步是将边数据合并到已导入的节点工作区。在Gephi的数据实验室中,边数据表应该是可见的,如下面的屏幕截图所示,“时间戳(Timestamp)”将以iso格式出现。
 

Gephi的边数据截图。

像我以往的程序一样,我在导入的网络图上应用了一个力导向算法来布局节点,并选择了用于着色和调整节点大小的属性。在下面的“概述(Overview)”窗口中,所设计的网络图在下面显示一个宽条,显示“启用时间线(Enable timeline)”选项。

Twitter转发网络图

只需选择“启用时间线”,会显示一个勾选的数字时间条,如下所示。左下角的设置轮允许设置时间格式,我从中选择“Datetime”。


 调整时间格式设置的屏幕截图。

只需使用光标选择时间间隔窗口的大小,然后按播放键。
 

使用光标调整时间窗口的大小并拖动到所需的开始位置。按“播放”开始动画

如前所述,我使用CloudApp创建动画网络的截屏gif,然后与我的共同作者共享。就这样!只需一点Python代码,就可以很容易地修改网络数据,以便在Gephi中对其进行动画处理。

我希望这篇教程是有帮助的,如果是的话,可以考虑在下面留下评论,这样我就知道大家对这个话题和/或这种风格的文章感兴趣。欢迎您提出任何问题和评论,请随时通过Linkedin与我联系。

原标题:

Animate Dynamic Graphs with Gephi Data visualization tutorial on animating time-dynamic behaviour in social network graphs.

原文链接:

https://towardsdatascience.com/animate-dynamic-graphs-with-gephi-d6bd9faf5aec


编辑:于腾凯
校对:林亦霖




译者简介





车前子,北大医学部,流行病与卫生统计专业博二在读。从临床医学半路出家到数据挖掘,感到了数据分析的艰深和魅力。即使不做医生,也希望用数据为医疗健康做一点点贡献。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。


点击文末“阅读原文”加入数据派团队~



转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。



点击“阅读原文”拥抱组织



浏览 343
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报