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查询Mysql时返回字典结构的代码
Jun 18 Python
python多重继承新算法C3介绍
Sep 28 Python
python如何在终端里面显示一张图片
Aug 17 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 Python
Python玩转Excel的读写改实例
Feb 22 Python
在python中求分布函数相关的包实例
Apr 15 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
Python根据URL地址下载文件并保存至对应目录的实现
Nov 15 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 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
windows中为php安装mongodb与memcache
2015/01/06 PHP
分享PHP守护进程类
2015/12/30 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
查看django版本的方法分享
2018/05/14 Python
python实现排序算法解析
2018/09/08 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
前处理组长岗位职责
2014/03/01 职场文书
英文导游词
2015/02/13 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
田径运动会通讯稿
2015/07/18 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
python保存图片的四个常用方法
2022/02/28 Python
使用scrapy实现增量式爬取方式
2022/06/21 Python