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协程用法实例分析
Jun 04 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
python lxml中etree的简单应用
May 10 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
python求质数列表的例子
Nov 24 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
jupyter实现重新加载模块
Apr 16 Python
python 绘制场景热力图的示例
Sep 23 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
Python 爬取淘宝商品信息栏目的实现
Feb 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
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
限制文本字节数js代码
2007/03/06 Javascript
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
js 分页全选或反选标识实现代码
2011/08/09 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
vue实现通讯录功能
2018/07/14 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
python实现顺序表的简单代码
2018/09/28 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
pygame实现五子棋游戏
2019/10/29 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
教育孩子心得体会
2014/01/01 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
干部考察材料范文
2014/12/24 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
学校安全管理制度
2015/08/06 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
SpringBoot快速入门详解
2021/07/21 Java/Android
Elasticsearch 基本查询和组合查询
2022/04/19 Python