Python朋友网络可视化

4
我有数百个列表(每个列表对应一个人)。 每个列表包含100个字符串,这些字符串是该人的100个朋友。
我想根据朋友共同数量来3D可视化这个人际网络。考虑任意两个列表,它们具有相同字符串越多,它们在这个3D图中就应该越靠近。我希望在3D图上将每个列表显示为一个点,而不是点之间的节点/连接。
为了简洁起见,这里只包含3个人。
person1 = ['mike', 'alex', 'arker','locke','dave','david','ross','rachel','anna','ann','darl','carl','karle']

person2 = ['mika', 'adlex', 'parker','ocke','ave','david','rosse','rachel','anna','ann','darla','carla','karle']

person3 = ['mika', 'alex', 'parker','ocke','ave','david','rosse','ross','anna','ann','darla','carla','karle', 'sasha', 'daria']

我认为你最好使用像Gephi这样专门为此类任务设计的工具,甚至还有Python脚本控制台。 - Mike Wise
@MikeWise 嗨 Mike,我也从别人那里听说过 Gephi,你能给一些开始这个问题的建议吗? - J.A
好的,现在看一下。 - Mike Wise
1个回答

9

Gephi设置步骤:

  • 安装Gephi并启动它
  • 您可能想现在升级所有插件,请查看右下角的按钮。
  • 现在创建一个新项目。
  • 确保当前工作区为Workspace1
  • 启用Graph Streaming插件
  • 在随后出现的Streaming选项卡中配置服务器以使用http和端口8080
  • 启动服务器(然后它将具有绿色的点而不是红色的点)。

Python步骤:

  • 安装gephistreamer包(pip install gephistreamer

将以下Python代码复制到类似friends.py的文件中:

from gephistreamer import graph
from gephistreamer import streamer
import random as rn

stream = streamer.Streamer(streamer.GephiWS(hostname="localhost",port=8080,workspace="workspace1"))

szfak = 100  # this scales up everything - somehow it is needed
cdfak = 3000

nodedict = {}
def addfnode(fname):
  # grab the node out of the dictionary if it is there, otherwise make a newone
  if (fname in nodedict):
    nnode = nodedict[fname]
  else:
    nnode = graph.Node(fname,size=szfak,x=cdfak*rn.random(),y=cdfak*rn.random(),color="#8080ff",type="f")
    nodedict[fname] = nnode # new node into the dictionary
  return nnode

def addnodes(pname,fnodenamelist):
  pnode = graph.Node(pname,size=szfak,x=cdfak*rn.random(),y=cdfak*rn.random(),color="#ff8080",type="p")
  stream.add_node(pnode)
  for fname in fnodenamelist:
    print(pname+"-"+fname)
    fnode = addfnode(fname)
    stream.add_node(fnode)
    pfedge = graph.Edge(pnode,fnode,weight=rn.random())
    stream.add_edge(pfedge)

person1friends = ['mike','alex','arker','locke','dave','david','ross','rachel','anna','ann','darl','carl','karle']
person2friends = ['mika','adlex','parker','ocke','ave','david','rosse','rachel','anna','ann','darla','carla','karle']
person3friends = ['mika','alex','parker','ocke','ave','david','rosse','ross','anna','ann','darla','carla','karle','sasha','daria']

addnodes("p1",person1friends)
addnodes("p2",person2friends)
addnodes("p3",person3friends)

使用命令 python friends.py 运行它。您将看到所有节点出现。然后有许多方法可以布局,使其看起来更好。在这里我使用了 Force Atlas 布局器,您可以在左侧看到我正在使用的参数。

enter image description here

一些注意事项:

  • 您可以通过单击底部状态/控制栏上的 T 来显示或隐藏标签。
  • 通过打开 Window/Data Table,可以查看节点和边中的数据。
  • 这是一个非常丰富的程序,有比你想象的更多选项。
  • 您可以在 Python 代码中设置更多节点和边的属性,然后它们将显示在数据表视图中,并可用于过滤等操作。
  • 您需要注意 Gephi 右下角的更新按钮,因为有很多需要修复的错误。

这将帮助您入门(如您所请求),但对于您的特定问题:

  • 您还需要计算人员之间的权重(“p”节点),并使用这些权重将它们链接在一起。
  • 然后您需要找到一个布局器和参数,以根据新权重将这些节点定位在所需的位置。
  • 因此,您实际上不需要显示 type="f" 的节点,只需要 "p" 节点即可。
  • “p”节点之间的权重应基于朋友名称集合的交集。
  • 还有 Gephi 插件可以在 3D 中显示它,但那实际上是完全不同的问题,您可能想先在 2D 中让它正常工作。

这在 Windows 10 上使用 Anaconda 4.4.1Python 3.5.2Gephi 0.9.1 运行。


非常感谢,我从三月份开始一直在寻找答案,感激不尽。 - J.A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接