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中声明只包含一个元素的元组数据方法
Aug 25 Python
python实现的简单猜数字游戏
Apr 04 Python
python导入模块交叉引用的方法
Jan 19 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
Python语法分析之字符串格式化
Jun 13 Python
在Pandas中处理NaN值的方法
Jun 25 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 Python
解决jupyter notebook启动后没有token的坑
Apr 24 Python
python unittest单元测试的步骤分析
Aug 02 Python
python创建字典及相关管理操作
Apr 13 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
php继承的一个应用
2011/09/06 PHP
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
2021/02/08 Javascript
Python的另外几种语言实现
2015/01/29 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
django批量导入xml数据
2016/10/16 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
python global关键字的用法详解
2019/09/05 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
节约电力资源的建议书
2014/03/12 职场文书
电气工程自动化求职信
2014/03/14 职场文书
第二课堂活动总结
2014/05/07 职场文书
保护环境倡议书100字
2014/05/19 职场文书
《穷人》教学反思
2016/02/19 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技