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时间整形转标准格式的示例分享
Feb 14 Python
python 实现在Excel末尾增加新行
May 02 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
如何用Python来搭建一个简单的推荐系统
Aug 07 Python
python命名空间(namespace)简单介绍
Aug 10 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
django框架auth模块用法实例详解
Dec 10 Python
解决python 读取 log日志的编码问题
Dec 24 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
pycharm的python_stubs问题
Apr 08 Python
从python读取sql的实例方法
Jul 21 Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 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 CKEditor 上传图片实现代码
2009/11/06 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
PHP 第一节 php简介
2012/04/28 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
详解python单例模式与metaclass
2016/01/15 Python
python web框架学习笔记
2016/05/03 Python
python daemon守护进程实现
2016/08/27 Python
python中异常捕获方法详解
2017/03/03 Python
python 文件操作删除某行的实例
2017/09/04 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python实时监控logstash日志代码
2020/04/27 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
大学国际贸易专业自荐信
2014/06/05 职场文书
护士求职信
2014/07/05 职场文书
暑期培训心得体会
2014/09/02 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
关于安全的广播稿
2014/10/23 职场文书