lefwf

来源:互联网 发布:电脑软件制作教程 编辑:程序博客网 时间:2024/06/08 06:41

importcsv

importjson

 

defloaddata():

    file = open(r'thesis.csv', 'r')  # 读入论文信息文件

    fileopen = csv.reader(file)

    header = next(fileopen)

 

    #存储第一作者的信息

    first_author = []

 

    #存储最终的学者信息

    scholar = []

 

    for row in fileopen:

        if row[0] not in first_author:  # 第一作者统计

            first_author.append(row[0])

 

    # 由于所有的第一、第二作者加起来太多,我们只统计第一作者

    scholar = first_author

 

    print("data loaded")

    return scholar

 

loaddata函数用于初始化数据,载入csv文件,将所有的筛选出来的第一作者赋给scholar数组

 

defupdatelink(scholar):

    file1 = open(r'thesis.csv', 'r')  # 再次打开论文信息文件

    fileopen1 = csv.reader(file1)

    header1 = next(fileopen1)

 

    # 第一作者之间互相合作的次数统计的二维矩阵

    link = [[0 for j in range(len(scholar))]for i in range(len(scholar))]

 

    for row in fileopen1:

        if row[0] in scholar:

            cowoker = row[2].split(';')

 

            for woker in cowoker:

                if woker in scholar:

                   link[scholar.index(row[0])][scholar.index(woker)] += 1

 

    for i in range(len(scholar)):

        link[i][i] = 0

 

    print("link updated")

    return link

 

updatelink函数用于生成一个二维数组link[][]来存储每两个学者之间的合作信息

 

defauthorinfo(scholar,link):

    data = []

 

    # 用来统计每个第一作者和其他人一共合作的次数

    times = [0] * len(scholar)

 

    for i in range(len(scholar)):

        times[i] += sum(link[i])

        for j in range(len(scholar)):

            times[i] += link[j][i]

 

    for i in range(len(scholar)):  # 统计每两个人之间的合作次数

        for j in range(i + 1, len(scholar)):

            temp = link[i][j] + link[j][i]

            link[i][j], link[j][i] = temp, temp

 

    # 用来生成每个学者、每个节点的信息,适应echart所需要的格式

    for i in range(len(scholar)):

        if times[i] != 0:

            person = {}

            person["name"] =scholar[i]

            person["symbolSize"] =times[i] * 5

            person["category"] = i %5

            person["draggable"] ="true"

            person["value"] = times[i]

            data.append(person)

 

    print("author")

    return data

 

 

authorinfo函数用于将学者的信息进行整理,获得echart所需要的节点信息,这里我们会进一步筛选掉一部分学者

 

deflinksinfo(scholar,link):

    links = []

 

    for i in range(len(scholar)):  # 生成每条边的信息

        for j in range(i + 1, len(scholar)):

            if link[i][j] != 0:

               links.append({"source": scholar[i], "target":scholar[j], "value": link[i][j]})

 

    print("links")

    return links

 

linksinfo函数用于生成边的信息。

 

if__name__=='__main__':

    scholar = loaddata()

    link = updatelink(scholar)

    data = authorinfo(scholar,link)

    links = linksinfo(scholar,link)

 

    output = {}

    output['data'] = data  # 生成json格式的文件

    output['links'] = links

 

    withopen("C:\wamp64\www\project\data.json", "w") as f:  # 将数据写入json文件中

        json.dump(output, f, sort_keys=True,indent=4, separators=(',', ':'))

 

    print("finished")

 

 

<!DOCTYPEhtml>

<htmlstyle="width: 100%;height:100%;">

<head>

    <meta charset="utf-8">

    <title>ECharts</title>

    <!-- 引入 echarts.js -->

    <scriptsrc="echarts.js"></script>

    <scriptsrc="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>  

    <scriptsrc="dataTool.js"></script>

</head>

<bodystyle="width: 100%;height:100%;">

 

    <!-- 为ECharts准备一个具备大小(宽高)的Dom-->

    <div id="main"style="width: 100%;height:100%;"></div>

    <scripttype="text/javascript">

 

        // 基于准备好的dom,初始化echarts实例

        var myChart =echarts.init(document.getElementById('main'));

 

        // 加载同目录下json文件中的json数据

        $.getJSON("./data.json",function(linedata) {

    var option = {

 

        //设置整个页面的背景颜色

        backgroundColor: newecharts.graphic.RadialGradient(0.3, 0.3, 0.8, [{

            offset: 0,

            color: '#f7f8fa'

        }, {

            offset: 1,

            color: '#cdd0d5'

        }]),

 

        //设置标题

        title: {

            text: "学者合作信息图",

            top: "top",

            left: "center"

        },

        tooltip: {},

        legend: [{

            formatter: function(name) {

                return echarts.format.truncateText(name,40, '14px Microsoft Yahei', '…');

            },

            tooltip: {

                show: true

            },

            selectedMode: 'false',

            bottom: 20,

        }],

 

        //右上角的三个工具按钮

        toolbox: {

            show: true,

            feature: {

                // magicType: {

                //     show: true,

                //     type: ['force', 'chord']

                // },

                dataView: {

                    show: true,

                    readOnly: true

                },

                restore: {

                    show: true

                },

                saveAsImage: {

                    show: true

                }

            }

        },

        animationDuration: 3000,

        animationEasingUpdate: 'quinticInOut',

 

        //图片的形式

        series: [{

            name: 'scholar',

            type: 'graph',

            layout: 'force',

 

            force: {

                repulsion: 1000

            },

 

            //设置节点信息和边的信息

            data: linedata.data,

            links: linedata.links,

            categories: [{

                'name': '分类1'

            }, {

                'name': '分类2'

            }, {

                'name': '分类3'

            }, {

                'name': '分类4'

            }, {

                'name': '分类5'

            }],

            focusNodeAdjacency: true,

            roam: true,

            label: {

                normal: {

 

                    show: true,

                    position: 'top',

 

                }

            },

            //边的格式

            lineStyle: {

                normal: {

                    opacity: 1,

                    width: 1,

                    curveness: 0.1

                }

            }

        }]

    };

    myChart.setOption(option)

})

    </script>

</body>

</html>