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中else语句块的使用技巧
Jun 16 Python
Python命令启动Web服务器实例详解
Feb 23 Python
Django卸载之后重新安装的方法
Mar 15 Python
对Python中9种生成新对象的方法总结
May 23 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
pandas计数 value_counts()的使用
Jun 24 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
新手学python应该下哪个版本
Jun 11 Python
Python爬取网页信息的示例
Sep 24 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
Python基础之条件语句详解
Jun 16 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输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
Angular使用Md5加密的解决方法
2017/09/16 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python+matplotlib实现华丽的文本框演示代码
2018/01/22 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
python实现随机漫步算法
2018/08/27 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
如何基于线程池提升request模块效率
2020/04/18 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
美国高街时尚品牌:OASAP
2016/07/24 全球购物
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
北大自主招生自荐信
2013/10/19 职场文书
医院实习接收函
2014/01/12 职场文书
《钱学森》听课反思
2014/03/01 职场文书
初中家长寄语
2014/04/02 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
大学生助学金感谢信
2015/01/21 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
捐款通知怎么写
2015/04/24 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
一文搞懂Java中的注解和反射
2022/06/21 Java/Android