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 文件处理注意事项总结
Apr 10 Python
python数据类型_字符串常用操作(详解)
May 30 Python
简单谈谈python中的语句和语法
Aug 10 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
Aug 23 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
通过案例解析python鸭子类型相关原理
Oct 10 Python
Python经典五人分鱼实例讲解
Jan 04 Python
python 制作磁力搜索工具
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
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
Python实现周期性抓取网页内容的方法
2015/11/04 Python
使用Python实现简单的服务器功能
2017/08/25 Python
python实现简单http服务器功能
2018/09/17 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
资深生产主管自我评价
2013/09/22 职场文书
日语专业毕业生求职信
2013/12/04 职场文书
工程班组长岗位职责
2013/12/30 职场文书
统计岗位职责
2014/02/21 职场文书
求职自荐信怎么写
2014/03/06 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
如何写求职信
2014/05/24 职场文书
白莲教口号
2014/06/18 职场文书
学校社会实践活动总结
2014/07/03 职场文书
仲裁协议书
2014/09/26 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript