可视化展示——实现论文引用关系动图展示

本文详细介绍了如何使用PyEcharts和Django在Web界面上动态展示论文引用关系图,包括解决权限问题、图片展示问题及年份与会议信息的导入,最终实现了动态图的高效展示。

效果

实现将队友处理好的用pyecharts展示出来的论文引用之间的关系(动态图)展示到web界面上:
在这里插入图片描述
首先,到pyecharts官方文档学习怎么和django后台进行融合:

https://pyecharts.org/#/zh-cn/intro

代码:

  • 思路: 在django 的view视图中,将生成的动态图的json文件传到前端,从而从前端进行展示。

paper_detail.html文件:(添加)

 <div class="panel panel-info" id="引用inlinks ">
                    <div class="panel-heading">
                        <h2>引用inlinks </h2>
                    </div>
                    <div class="panel-body">
                        <!-- inlinks 图片展示 -->
                        <div id="graph_inlink" style="width:900px; height:500px;"></div>
                    </div>
                </div>

                <div class="panel panel-info" id="引用outlinks ">
                    <div class="panel-heading">
                        <h2>引用outlinks </h2>
                    </div>
                    <div class="panel-body">
                        <!-- outlinks 图片展示 -->
                        <div id="graph_outlink" style="width:900px; height:500px;"></div>
                    </div>
                </div>

                <div class="panel panel-info" id="GeneralTerms">
                    <div class="panel-heading">
                        <h2>GeneralTerms </h2>
                    </div>
                    <div class="panel-body">
                        <p style="font-size:20px ;font-weight:bold">{{GeneralTerms}}</p>
                    </div>
                </div>

   <script type="text/javascript">
            $(document).ready(function () {
                $("#myNav").affix({
                    offset: {
                        top: 125
                    }
                });
            });
           //outlinks 图片展示
            var outlinks_s = {{ outlinks | safe }};
            var chart_1 = echarts.init(
                document.getElementById('graph_outlink'), 'roma', { renderer: 'canvas' });
            var option_1 = outlinks_s
            chart_1.setOption(option_1);
            //inlinks 图片展示
            var inlinks_s = {{ inlinks | safe }};
            var chart_2 = echarts.init(
                document.getElementById('graph_inlink'), 'roma', { renderer: 'canvas' });
            var option_2 = inlinks_s
            chart_2.setOption(option_2);
        </script>

view.py文件:

 # 论文的引用的可视化:-----------------outlinks--------------------------------------
    # node_id 是包括该论文和其引用论文id的list
    node_name = []
    node_name = outlink.split('/')
    node_name.insert(0, str(node))
    # 构造关系图的nodes
    nodes = []
    for name in node_name:
        temp = {}
        temp['name'] = name
        temp['symbolSize'] = 20
        temp['category'] = 1
        nodes.append(temp)
    nodes[0]['category'] = 0

    # 构造关系图的links
    sname = node_name[0]
    links = []
    for i in nodes:
        links.append({"source": sname, "target": i.get("name")})

    # 构造关系图的categories
    categories = [{'name': '本论文'}, {'name': '引用论文'}]
    c = (Graph(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
        .add('', nodes=nodes, links=links, categories=categories, repulsion=1500, edge_symbol=['circle', 'arrow'])
        .set_global_opts(title_opts=opts.TitleOpts(title="论文引用关系图")))
    c.render(path="choose_paper/data/graph/graph_outlink_tmp.txt")
    print(c.load_javascript())
    outlink_txt = "{"
    with open('choose_paper/data/graph/graph_outlink_tmp.txt', 'r', encoding='utf-8') as f:
         line = f.readlines()
         for i in range(15,len(line)-4):
            outlink_txt+=line[i]

    # 论文的引用的可视化:-----------------inlinks--------------------------------------
    # node_id 是包括该论文和其引用论文id的list
    node_name = []
    node_name = inlink.split('/')
    node_name.insert(0, str(node))
    # 构造关系图的nodes
    nodes = []
    for name in node_name:
        temp = {}
        temp['name'] = name
        temp['symbolSize'] = 20
        temp['category'] = 1
        nodes.append(temp)
    nodes[0]['category'] = 0

    # 构造关系图的links
    sname = node_name[0]
    links = []
    for i in nodes:
        links.append({"source": sname, "target": i.get("name")})

    # 构造关系图的categories
    categories = [{'name': '本论文'}, {'name': '引用论文'}]
    c = (Graph(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
        .add('', nodes=nodes, links=links, categories=categories, repulsion=1500, edge_symbol=['circle', 'arrow'])
        .set_global_opts(title_opts=opts.TitleOpts(title="论文引用关系图")))
    c.render(path="choose_paper/data/graph/graph_inlink_tmp.txt")
    inlink_txt = "{"
    with open('choose_paper/data/graph/graph_inlink_tmp.txt', 'r', encoding='utf-8') as f:
         line = f.readlines()
         for i in range(15,len(line)-4):
            inlink_txt+=line[i]

遇到的问题:

1. 首先,想把整个渲染好的模型直接从view里面传到前端,但是报如下错误:

[Errno 13] Permission denied: ‘choose_paper/data/graph’

在这里插入图片描述
通过仔细观察,发现自己的view.py代码里面 c.render()函数在存储路径位置的时候,没有将其最后生成的文件graph_outlink.html写出,导致错误。
修改: c.render(path="choose_paper/data/graph/graph_outlink.html")

2. 在上面 c.render()函数之后,会在本地生成一个render.html文件,里面是pyecharts生成的html文件,最初是想把这个生成的html文件保存成png文件存储到本地,然后再在界面上显示:

第一步: 安装phantomjs
打开系统命令行,键入下列代码:

npm install -g phantomjs-prebuilt

第二步: 安装了 Nodejs 环境
下载链接:

https://nodejs.org/en/download/

第三步: 安装 pyecharts-snapshot

pip install pyecharts-snapshot

第四步: 重启计算机,render(path=“”)的输出路径和格式即可
参考:

https://blog.youkuaiyun.com/u011318077/article/details/90113206
https://blog.youkuaiyun.com/FightingBob/article/details/105874500
https://blog.youkuaiyun.com/Kyrie001/article/details/82822425/

但是这样不能动态的展示,而且图片也是错误的,用vscode打开图片后,发现里面存储的仍然是html文件的内容,所以放弃了此选项。

3. 将c.render()渲染出来的动态html文件保存在本地,以txt形式保存,并提取出其中body里面的所有内容,然后传给前端,用js将此段string写入html,但是出现的问题是,js对此种形式的string不感冒,根本不显示,猜测是js判断这个传过来的是一个html,所以不进行嵌入。
在这里插入图片描述

4. 之后又尝试在前端的JavaScript里面进行文件(渲染的html文件)内容的提取:

<script language="javascript"> 
var fso, ts, s ; 
var ForReading = 1; 

fso = new ActiveXObject("Scripting.FileSystemObject"); 
ts = fso.OpenTextFile("d:\\testfile.txt", ForReading); 
s = ts.ReadLine(); 
document.getElementById("aa").innerHTML=s; 
</script> 

但是报错:
在这里插入图片描述
尝试:

  • Internet 选项 -> 安全 - > 里面按下图修改(没有效果)
    在这里插入图片描述
  • 之后搜索资料发现,ActiveXObject存在和chrome不兼容的问题,为了更好的展示,所以也放弃了此思路。


5. 最后,将c.render()渲染出来的动态html文件保存在本地,以txt形式保存,并提取出下图中用来渲染html的json形式的数据,将此数据传给前端,进行界面的展示,这个方法最后获得了成功。
在这里插入图片描述

<script type="text/javascript">
            $(document).ready(function () {
                $("#myNav").affix({
                    offset: {
                        top: 125
                    }
                });
            });
           //outlinks 图片展示
            var outlinks_s = {{ outlinks | safe }};
            var chart_1 = echarts.init(
                document.getElementById('graph_outlink'), 'roma', { renderer: 'canvas' });
            var option_1 = outlinks_s
            chart_1.setOption(option_1);
            //inlinks 图片展示
            var inlinks_s = {{ inlinks | safe }};
            var chart_2 = echarts.init(
                document.getElementById('graph_inlink'), 'roma', { renderer: 'canvas' });
            var option_2 = inlinks_s
            chart_2.setOption(option_2);
        </script>

3.加入年份和会议:
在这里插入图片描述

将队友获取的year,venues文件导入django:

1.在读取venus文件的时候出现下面的报错:
在这里插入图片描述
解决:
这类错误的原因是编码造成的,通常情况下都是utf-8编码,这需要变换一下,改成encoding="ISO-8859-1"即可:file = pd.read_csv("/input/Aliases.csv",encoding="ISO-8859-1")
参考:

https://www.cnblogs.com/zhangshitong/p/11281312.html

解决时间选择器不显示问题:

效果:
在这里插入图片描述

  <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <link href="http://www.bootcss.com/p/bootstrap-datetimepicker/bootstrap-datetimepicker/css/datetimepicker.css" rel="stylesheet">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="http://www.bootcss.com/p/bootstrap-datetimepicker/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
    <script src="http://www.bootcss.com/p/bootstrap-datetimepicker/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>


出现时间选择器不显示的原因:
1.datetimepicker.js 文件导入顺序,应该在最下面导入,最起码要在jquery.js之后
2.jquery与datetimepicker不适配

上述内容详见:

https://blog.youkuaiyun.com/qq_41798302/article/details/106809173

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值