实现论文引用关系动图展示
效果
实现将队友处理好的用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
本文详细介绍了如何使用PyEcharts和Django在Web界面上动态展示论文引用关系图,包括解决权限问题、图片展示问题及年份与会议信息的导入,最终实现了动态图的高效展示。
6439

被折叠的 条评论
为什么被折叠?



