Python基于pyecharts實(shí)現(xiàn)關(guān)聯(lián)圖繪制
生活中有很多需要用到關(guān)聯(lián)圖的地方,至少我認(rèn)為的是這樣的圖:https://www.echartsjs.com/examples/zh/editor.html?c=graph-npm

我是在使用Word2Vec計(jì)算關(guān)聯(lián)詞的余弦距離之后,想要更好的展示出來的時候,遇到的這種情況,就做了下拓展。
畫圖的步驟主要分為:
1. 將距離數(shù)據(jù)(或者相關(guān)數(shù)據(jù))讀入;
2. 按照一定的格式和參數(shù)將數(shù)據(jù)保存為json字符串;
3. 根據(jù)json串,繪制關(guān)聯(lián)圖。
具體而言,主要是:
<1>. 首先有一批數(shù)據(jù),如圖所示:

<2>. 導(dǎo)入所需要的包
import json
import pandas as pd
import random
import copy
<3>. 產(chǎn)生顏色隨機(jī)值的函數(shù)
# 隨機(jī)顏色
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包括前后節(jié)點(diǎn)0和14
return "#"+color_code
<4>. 生成隨機(jī)坐標(biāo)
# 隨機(jī)坐標(biāo)
#生成隨機(jī)數(shù),浮點(diǎn)類型
def generate_position(n):
# n = 10
for i in range(n):
x = round(random.uniform(-2000, 2000), 5) #一定范圍內(nèi)的隨機(jī)數(shù),范圍可變
y = round(random.uniform(-2000, 2000), 5) #控制隨機(jī)數(shù)的精度round(數(shù)值,精度)
return x, y
<5>. 生成json格式的節(jié)點(diǎn)數(shù)據(jù)
def create_json(data, weights):
# 自定義節(jié)點(diǎn)
address_dict = {"nodes":[], "edges":[]}
node_dict = {
"color": "",
"label": "",
"attributes": {},
"y": None,
"x": None,
"id": "",
"size": None
}
edge_dict = {
"sourceID": "",
"attributes": {},
"targetID": "",
"size": None
}
# 給節(jié)點(diǎn)賦值
for ii in range(len(data)):
for jj in range(len(data.iloc[ii])):
# node,"attributes"屬性可自行設(shè)置
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>. 主函數(shù)生成json數(shù)據(jù)
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 = ['球類','籃球','足球','羽毛球','美食','肯德基','火鍋','烤魚','飲料','可樂','紅茶','奶茶']) #建立索引權(quán)值列表
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數(shù)據(jù)如下:

<7>. 繪制關(guān)聯(lián)圖,里面的文件讀取和保存地址自行修改,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: #設(shè)置以utf-8解碼模式讀取文件,encoding參數(shù)必須設(shè)置,否則默認(rèn)以gbk模式讀取文件,當(dāng)文件中包含中文時,會報(bào)錯
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="熱詞對應(yīng)的關(guān)聯(lián)詞"))
.render("關(guān)聯(lián)詞圖.html")
)
最后,就生成了最開始的那張圖。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
GitHub上值得推薦的8個python 項(xiàng)目
GitHub 無疑是代碼托管領(lǐng)域的先行者,Python 作為一種通用編程語言,已經(jīng)被千千萬萬的開發(fā)人員用來構(gòu)建各種有意思或有用的項(xiàng)目。以下我們會介紹一些使用 Python 構(gòu)建的GitHub上優(yōu)秀的項(xiàng)目。2020-10-10
cython加速python代碼的方法實(shí)現(xiàn)
本文主要介紹了cython加速python代碼的方法實(shí)現(xiàn),特別是在涉及到數(shù)值計(jì)算密集型任務(wù)時,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Django REST framework 分頁的實(shí)現(xiàn)代碼
這篇文章主要介紹了Django REST framework 分頁的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Python RobotFramework的安裝過程及應(yīng)用實(shí)戰(zhàn)教程
這篇文章主要介紹了RobotFramework的安裝過程及應(yīng)用實(shí)戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
Python Selenium Cookie 繞過驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼
這篇文章主要介紹了Python Selenium Cookie 繞過驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
Python 實(shí)現(xiàn)在文件中的每一行添加一個逗號
下面小編就為大家分享一篇Python 實(shí)現(xiàn)在文件中的每一行添加一個逗號,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

