Python 好友网络可视化

Python friends network visualization

我有数百个列表(每个列表对应1个人)。每个列表包含100个字符串,是那个人的100个朋友。

我想根据他们拥有的共同朋友的数量对这个人际网络进行 3D 可视化。考虑任何 2 个列表,它们具有的相同字符串越多,它们在这个 3D 图形中出现的位置就越接近。我想将每个列表显示为 3D 图形上的一个点,点之间没有 nodes/connections。

为了简洁起见,我在这里只包括了 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 设置步骤:

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

Python 步数:

  • 安装 gephistreamer 包 (pip install gephistreamer)

将以下 python cod 复制到 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 布局器,您可以在左侧看到我正在使用的参数。

一些注意事项:

  • 您可以通过单击底部 status/control 栏上的 T 使标签显示或消失。
  • 打开Window/Data Table查看节点和边中的数据。
  • 这是一个非常丰富的程序,选项多得你动弹不得。
  • 您可以在 python 代码中为您的节点和边设置更多属性,然后它们将显示在数据 table 视图中并可用于过滤等
  • 你要注意Gephi右下角的那个更新按钮,有很多bug需要修复。

这将帮助您开始(如您所问),但对于您的特定问题:

  • 您还需要为您的人员("p" 节点)计算权重,并且 link 他们使用这些权重
  • 然后你需要找到一个布局器和参数,根据新的权重按照你想要的方式定位这些节点。
  • 所以你真的不需要显示 type="f" 个节点,你只需要 "p" 个节点。
  • 到 "p" 个节点之间的权重应基于好友名称集合的交集。
  • 还有 Gephi 插件可以在 3D 中显示它,但这实际上是一个完全独立的问题,您可能希望先在 2D 中显示它。

这是 运行 Windows 10 使用 Anaconda 4.4.1 Python 3.5.2Gephi 0.9.1.