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 THREADING模块中的JOIN()方法深入理解
Feb 18 Python
用Python编写简单的微博爬虫
Mar 04 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
python+opencv实现动态物体识别
Jan 09 Python
mac下如何将python2.7改为python3
Jul 13 Python
python使用knn实现特征向量分类
Dec 26 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
在python tkinter界面中添加按钮的实例
Mar 04 Python
PyMongo 查询数据的实现
Jun 28 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获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
js实现最短的XML格式化工具实例
2015/03/12 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
axios学习教程全攻略
2017/03/26 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
python使用插值法画出平滑曲线
2018/12/15 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
《三亚落日》教学反思
2014/04/26 职场文书
还款承诺书范文
2014/05/20 职场文书
体育活动总结
2015/02/04 职场文书
用电申请报告范文
2015/05/18 职场文书
安全第一课观后感
2015/06/18 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers