可视化学习-转化电子邮件为图

目标
创建一个简单程序,将文件转化为一个节点和连接的集合,节点是所有参与者,连接是参与者之间的电子邮件列表,关联着权重,代表参与者之间的通信次数
代码

import csv

nodemap={}
linkmap={}

def addNode(key,kbytes):#定义节点函数
    if key in nodemap:
        node=nodemap[key]
        node["count"]+=1
        node["size"]+=kbytes
    else:
        node={"id":key,"count":1,"size":kbytes}
        nodemap[key]=node
    return

def addLink(src,tgt,kbytes):  #定义连线函数
    key=src+"..."+tgt
    if key in linkmap:
        link=linkmap[key]
        link["count"]+=1
        link["size"]+=kbytes
    else:
        link={"src":src,"tgt":tgt,"count":1,"size":kbytes}
        linkmap[key]=link
    return

#打开文件,跳过第一排
with open("genericEmails.txt") as datafile:
    datareader = csv.reader(datafile, delimiter="\t")
    next(datareader, None)

    for row in datareader:
        kb=int(row[4].replace("kb",""))#将kb移除,并转换字符串为整数
        distlist=[];#创建所有人的姓名分发列表
        for i in range(0,3):#从from--to--cc遍历
            names=row[i].replace('"','').split(';')#用分号来拆分字段
            for name in names:
                name=name.strip()#移除无关空格
                if(name!=""):#添加名字到分发列表
                    distlist.append(name)
        for i in range(0,len(distlist)):#创建节点
            addNode(distlist[i],kb)

        #创建无向连接,如果创建有向连接、和创建节点类似
        #由于一对人之间只有一个连接,可以按字母顺序定义连接避免重复
        for i in range(0,len(distlist)):
            for j in range(i+1,len(distlist)):
                if(distlist[i]<distlist[j]):
                    source=distlist[i]
                    target=distlist[j]
                else:
                    source=distlist[j]
                    target=distlist[i]
                addLink(source,target,kb)

#写节点
with open("nodes.csv","w",newline="") as csvfile:
    formatter=csv.writer(csvfile)
    formatter.writerow(["Node","NumEmail","SumSize"])
    for key in nodemap:
        node=nodemap[key]
        formatter.writerow([node["id"],node["count"],node["size"]])

#写连接
with open("links.csv","w",newline="") as csvfile:
    formatter=csv.writer(csvfile)
    formatter.writerow(["Source","Target","NumEmail","SumSize"])
    for key in linkmap:
        lk = linkmap[key]
        formatter.writerow([lk["src"],lk["tgt"],lk["count"],lk["size"]])

遇到的问题
1.使用Gephi导入处理好的数据时,概览界面有图但是预览界面没有
如下
在这里插入图片描述
在这里插入图片描述
2.数据过多造成标签、节点遮盖的问题,对标签和节点调整了相对大小,还是存在遮盖问题
解决方法
1.暂时还没有解决
2.书上看到可以分层解决,同时还可以调整标签对其简化缩短,但是还没有试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值