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调用cmd复制文件代码分享
Dec 27 Python
深度剖析使用python抓取网页正文的源码
Jun 11 Python
在Python中操作字典之setdefault()方法的使用
May 21 Python
Python实现文件复制删除
Apr 19 Python
Python实现视频下载功能
Mar 14 Python
python中的计时器timeit的使用方法
Oct 20 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
python看某个模块的版本方法
Oct 16 Python
python多进程使用函数封装实例
May 02 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
Python二元算术运算常用方法解析
Sep 15 Python
python和anaconda的区别
May 06 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通用防注入程序 推荐
2011/02/26 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
python转换摩斯密码示例
2014/02/16 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python实现windows下文件备份脚本
2018/05/27 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
Python rstrip()方法实例详解
2018/11/11 Python
关于Python作用域自学总结
2019/06/10 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
银行个人求职自荐信范文
2013/12/16 职场文书
教师业务培训方案
2014/05/01 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
硕士生找工作求职信
2014/07/05 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
个人职业及收入证明
2014/10/13 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
《给予树》教学反思
2016/03/03 职场文书
python tkinter模块的简单使用
2021/04/07 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python