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.2 和 Gephi 0.9.1.
我有数百个列表(每个列表对应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.2 和 Gephi 0.9.1.