Python基于pyecharts实现关联图绘制


Posted in Python onMarch 27, 2020

生活中有很多需要用到关联图的地方,至少我认为的是这样的图:https://www.echartsjs.com/examples/zh/editor.html?c=graph-npm

Python基于pyecharts实现关联图绘制

我是在使用Word2Vec计算关联词的余弦距离之后,想要更好的展示出来的时候,遇到的这种情况,就做了下拓展。

画图的步骤主要分为:

1. 将距离数据(或者相关数据)读入;

2. 按照一定的格式和参数将数据保存为json字符串;

3. 根据json串,绘制关联图。

具体而言,主要是:

<1>. 首先有一批数据,如图所示:

Python基于pyecharts实现关联图绘制

<2>. 导入所需要的包

import json
import pandas as pd
import random
import copy

<3>. 产生颜色随机值的函数

# 随机颜色
def randomcolor_func():
  color_char = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
  color_code = ""
  for i in range(6):
    color_code += color_char[random.randint(0,14)] # randint包括前后节点0和14
  return "#"+color_code

<4>. 生成随机坐标

# 随机坐标
#生成随机数,浮点类型
def generate_position(n):
#  n = 10
  for i in range(n):
    x = round(random.uniform(-2000, 2000), 5) #一定范围内的随机数,范围可变
    y = round(random.uniform(-2000, 2000), 5) #控制随机数的精度round(数值,精度)
  return x, y

<5>. 生成json格式的节点数据

def create_json(data, weights):
  # 自定义节点
  address_dict = {"nodes":[], "edges":[]}
  node_dict = {
     "color": "",
     "label": "",
     "attributes": {},
     "y": None,
     "x": None,
     "id": "",
     "size": None
    }
  edge_dict = {
     "sourceID": "",
     "attributes": {},
     "targetID": "",
     "size": None
    }
  
  # 给节点赋值
  for ii in range(len(data)):
    for jj in range(len(data.iloc[ii])):
      # node,"attributes"属性可自行设置
      node_dict[r"color"] = randomcolor_func()
      node_dict[r"label"] = data.iloc[ii, jj]
      x, y = generate_position(1)
      node_dict[r"y"] = y
      node_dict[r"x"] = x
      node_dict[r"id"] = data.iloc[ii, jj]
      node_dict[r"size"] = int(weights.loc[data.iloc[ii, jj]])
      
      tmp_node = copy.deepcopy(node_dict)
      address_dict[r"nodes"].append(tmp_node)
      
  for ii in range(len(data)):
    for jj in range(1, len(data.iloc[ii])):    
      # edge
      edge_dict[r"sourceID"] = data.iloc[ii, 0]
      edge_dict[r"targetID"] = data.iloc[ii, jj]
      edge_dict[r"size"] = 2
      
      tmp_edge = copy.deepcopy(edge_dict)
      address_dict["edges"].append(tmp_edge)
  
  return address_dict

<6>. 主函数生成json数据

if __name__ == '__main__': 
  # read data
  data = pd.read_excel(r'test_josn_data.xlsx', 0)
  
  weights = pd.DataFrame({"词频":[100, 40, 30, 20, 90, 50, 35, 14, 85, 38, 29, 10]}, 
              index = ['球类','篮球','足球','羽毛球','美食','肯德基','火锅','烤鱼','饮料','可乐','红茶','奶茶']) #建立索引权值列表
  
  address_dict = create_json(data, weights)
  
  with open("write_json.json", "w", encoding='utf-8') as f:
    # json.dump(dict_, f) # 写为一行
    json.dump(address_dict, f, indent=2, ensure_ascii=False) # 写为多行

最后形成的json数据如下:

Python基于pyecharts实现关联图绘制

<7>. 绘制关联图,里面的文件读取和保存地址自行修改,write_json.json 就是上面保存的json文件

import pyecharts.options as opts
from pyecharts.charts import Graph
import json

with open(r"D:\Python_workspace\spyder_space\test_各种功能\write_json.json", encoding='utf-8') as f: #设置以utf-8解码模式读取文件,encoding参数必须设置,否则默认以gbk模式读取文件,当文件中包含中文时,会报错
  data = json.load(f)
#print(data)

nodes = [
  {
    "x": node["x"],
    "y": node["y"],
    "id": node["id"],
    "name": node["label"],
    "symbolSize": node["size"],
    "itemStyle": {"normal": {"color": node["color"]}},
  }
  for node in data["nodes"]
]

edges = [{"source": edge["sourceID"], "target": edge["targetID"]} for edge in data["edges"]]


(
  Graph(init_opts=opts.InitOpts(width="1600px", height="800px"))
  .add(
    series_name="",
    nodes=nodes,
    links=edges,
    layout="none",
    is_roam=True,
    is_focusnode=True,
    label_opts=opts.LabelOpts(is_show=True),
    linestyle_opts=opts.LineStyleOpts(width=0.5, curve=0.3, opacity=0.7),
  )
  .set_global_opts(title_opts=opts.TitleOpts(title="热词对应的关联词"))
  .render("关联词图.html")
)

最后,就生成了最开始的那张图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python smtplib模块发送SSL/TLS安全邮件实例
Apr 08 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
python之pexpect实现自动交互的例子
Jul 25 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 Python
Python字符串常规操作小结
Apr 03 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 #Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 #Python
Python itertools.product方法代码实例
Mar 27 #Python
python实现图像全景拼接
Mar 27 #Python
如何在Python 游戏中模拟引力
Mar 27 #Python
Python 实现平台类游戏添加跳跃功能
Mar 27 #Python
django配置app中的静态文件步骤
Mar 27 #Python
You might like
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
Python实现完整的事务操作示例
2017/06/20 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
化工专业应届生求职信
2013/11/08 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
内衣营销方案
2014/03/15 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
个人简历自荐信
2014/06/26 职场文书
户籍证明模板
2014/09/28 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
React实现动效弹窗组件
2021/06/21 Javascript
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
Golang 链表的学习和使用
2022/04/19 Golang