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文件特定行插入和替换实例详解
Jul 12 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python ddt实现数据驱动
Mar 14 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
python selenium循环登陆网站的实现
Nov 04 Python
python zip,lambda,map函数代码实例
Apr 04 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 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常用函数的使用汇总
2013/06/08 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
javascript模拟命名空间
2015/04/17 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
js实现烟花特效
2020/03/02 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
python使用cPickle模块序列化实例
2014/09/25 Python
Python利用ansible分发处理任务
2015/08/04 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
python实现交并比IOU教程
2020/04/16 Python
keras 权重保存和权重载入方式
2020/05/21 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
单位授权委托书范文
2014/08/02 职场文书
丧事答谢词
2015/01/05 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
拙作再改《我的收音机情缘》
2022/04/05 无线电