深度剖析Pyechars Graph关系图谱

前言

网上看了好多Graph,基本都是引用官网公示文档。路漫漫其修远兮,吾将上下而求索,花了近一周时间,总结一下自己对Pyechars Graph的理解,深度还原Pyechars Graph参数 nodes,links,category,希望能够帮助大家,在学习的路上少走一些弯路。
注:原创文章,仅供大家学习交流,转载请注明出处。

一 Graph微博转发关系图剖析

官网使用数据资料weibo.json 可以在GitHub上下载,也可以从本文的链接中获取全部所用资料;
(1)先展示一下源码和效果图;

import json
from pyecharts import options as opts
from pyecharts.charts import Graph

with open(r"C:\Users\GDY\Desktop\Study\CNDS\深度剖析Graph关系图谱\weibo.json", "r", encoding="utf-8") as f:
    j = json.load(f)
nodes, links, categories, cont, mid, userl = j

g = (
    Graph()
    .add(
        "",
        nodes,
        links,
        categories,
        repulsion=50,
        linestyle_opts=opts.LineStyleOpts(curve=0.2),
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        legend_opts=opts.LegendOpts(is_show=False),
        title_opts=opts.TitleOpts(title="微博转发关系图"),
    )
#     .render("微博转发关系图.html")
)
g.render_notebook()

在这里插入图片描述
(2)剖析数据源weibo.json
第一步先明确json文件的数据结构,是list of list 在嵌套dict的形式,如下:
[
[{},{},{}…] 对应weibo.json 中的nodes
[{},{},{}…] 对应weibo.json 中的links
[{},{},{}…] 对应weibo.json 中的categories
[{},{},{}…] 对应weibo.json 中的cont
[{},{},{}…] 对应weibo.json 中的mid
[{},{},{}…] 对应weibo.json 中的userl
]
源代码:

with open(r"C:\Users\GDY\Desktop\Study\CNDS\深度剖析Graph关系图谱\weibo.json", "r", encoding="utf-8") as f:
    j = json.load(f)
nodes, links, categories, cont, mid, userl = j

第二步将 nodes, links, categories, cont, mid, userl 转换为DataFrame,分析各字段的数据关系:
-A: nodes转换为DataFrame,观察数据结构:

import pandas as pd
df_nodes=pd.DataFrame(nodes)
df_nodes.head()

在这里插入图片描述
在这里插入图片描述
nodes有6个字段 name,symbolSize,draggable,value,category,label;
nodes表示的是Graph中的节点,name和category分别表示两个节点,symbolSize表示节点的大小,value表示节点的值,label是是否显示标签,如上图所示。
-B links转换为DataFrame,观察数据结构:

df_links=pd.DataFrame(links)
df_links.head()

在这里插入图片描述
在这里插入图片描述
links有2个字段 source,target;
links表示的是Graph中两节点之前的联系,source表示源,即被转发微博的用户,target表示目的,即转发微博的用户。

-C: categories转换为DataFrame,观察数据结构:

df_categories=pd.DataFrame(categories)
df_categories.head()

在这里插入图片描述
在这里插入图片描述
categories有1个字段 name;
经过多次研究测试发现,name表示非最后一个客户的name;
举例:李四转发了张三的,麻五转发了李四的,categories中的name就是:张三和李四;
nodes:name与categories:name的区别:
nodes:name 表示的是全量name,且不能重复,重复做出来的图是空白的;
categories:name表示非最后一个客户的name;
划重点,即:categories:name=nodes:name-last:name

-D:cont, mid, userl 数据:
在这里插入图片描述
cont, mid, user数据Graph没有用到,是其他无关的数据,我们这里不做深究;

二 通过excel的方式构造nodes,links,categories

假设A传给了B,B传给了C,D;
A是一级关系:
B是二级关系;
C,D是三级关系;
(1)构造nodes
nodes的字段为:name,symbolSize,draggable,value,category;
lable是字典的形式,我们在后面插入;

nodes=pd.DataFrame(data={'name':['A','B','C','D'],'symbolSize':[30,20,10,10]
                         ,'draggable':'False','value':[100,50,10,10],'category':['A','B','B','B']})
nodes

在这里插入图片描述
(2)构造links
links的字段为:source,target

links=pd.DataFrame(data={'source':['A','B','B'],'target':['B','C','D'],})
links

在这里插入图片描述

(3)构造categories

categories=pd.DataFrame(data={'name':['A','B']})
categories

在这里插入图片描述
(4)将nodes,links,categories转化为列表嵌套字典,显示A,B的label;
-A转换nodes

nodes_list1=[]
nodes_list2=[]
nodes_table1=nodes.loc[:1]
nodes_table2=nodes.loc[2:]
for index,row in nodes_table1.iterrows():
    row=row.to_dict() #转化为dict
    row['label']={'normal':{'show':'True'}} #添加A和B的label
    nodes_list1.append(row)
for index,row in nodes_table2.iterrows():
    row=row.to_dict()
    nodes_list2.append(row)
nodes=nodes_list1+nodes_list2
nodes

在这里插入图片描述
-B转换links

links_list=[]
for index,row in links.iterrows():
    row=row.to_dict() #转化为dict
    links_list.append(row)
links=links_list
links

在这里插入图片描述
-C转换categories

categories_list=[]
for index,row in categories.iterrows():
    row=row.to_dict() #转化为dict
    categories_list.append(row)
categories=categories_list
categories

在这里插入图片描述
在这里数据构造就大工告成了,展示一下示例图:

g = (
    Graph()
    .add(
        "",
        nodes,
        links,
        categories,
        repulsion=50,
        linestyle_opts=opts.LineStyleOpts(curve=0.2),
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        legend_opts=opts.LegendOpts(is_show=False),
        title_opts=opts.TitleOpts(title="微博转发关系图"),
    )
#     .render("微博转发关系图.html")
)
g.render_notebook()

在这里插入图片描述

三 Pyechars Graph图谱绘制总结

理解清楚了nodes,links,categories,我将它做成了excel,只要将要生成的数据放在对应的excel中就能生成Graph图谱啦,源代码和示例如下:

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Graph

nodes_data=pd.read_excel(r'C:\Users\GDY\Desktop\Study\CNDS\深度剖析Graph关系图谱\nodes.xlsx')
links_data=pd.read_excel(r'C:\Users\GDY\Desktop\Study\CNDS\深度剖析Graph关系图谱\links.xlsx')
categories_data=pd.read_excel(r'C:\Users\GDY\Desktop\Study\CNDS\深度剖析Graph关系图谱\categories.xlsx')
#构造nodes
nodes_list1=[]
nodes_list2=[]
nodes_table1=nodes_data.loc[:1]
nodes_table2=nodes_data.loc[2:]
for index,row in nodes_table1.iterrows():
    row=row.to_dict() #转化为dict
    row['label']={'normal':{'show':'True'}} #添加A和B的label
    nodes_list1.append(row)
for index,row in nodes_table2.iterrows():
    row=row.to_dict()
    nodes_list2.append(row)
nodes=nodes_list1+nodes_list2
#构造links
links=[]
for index,row in links_data.iterrows():
    row=row.to_dict() #转化为dict
    links.append(row)
#构造categories
categories=[]
for index,row in categories_data.iterrows():
    row=row.to_dict() #转化为dict
    categories.append(row)
g = (
    Graph()
    .add(
        "",
        nodes,
        links,
        categories,
        repulsion=50,
        linestyle_opts=opts.LineStyleOpts(curve=0.2),
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        legend_opts=opts.LegendOpts(is_show=False),
        title_opts=opts.TitleOpts(title="深度剖析Gatph关系图谱"),
    )
#     .render("微博转发关系图.html")
)
g.render_notebook()

在这里插入图片描述
耗时一周,记录总结一下Graph的学习笔记,源代码,weibo.json和文中使用的相关文件均已放置在百度网盘,大家自取,也欢迎大家的交流和总结。

文件地址:https://pan.baidu.com/s/1qXub5eu-YfM4FcN4dW5oWA 提取码:Grap

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
`label_opts`是`pyecharts`中用于设置节点标签的配置参数,`tooltip_formatter`是用于设置表的提示框格式化函数。 `label_opts`主要用于设置节点标签的样式和显示内容,它是一个字典类型的参数,可以设置以下几个属性: 1. `position`:设置标签相对节点的位置,默认为'inside',可以设置为'inside'、'top'、'bottom'、'left'、'right'、'insideLeft'、'insideRight'、'insideTop'、'insideBottom'、'insideTopLeft'、'insideTopRight'、'insideBottomLeft'、'insideBottomRight'等值。 2. `offset`:设置标签在x轴和y轴上的偏移量,默认为[0,0]。 3. `font_style`:设置标签的字体样式,默认为'normal'。 4. `font_weight`:设置标签的字体粗细,默认为'normal'。 5. `font_size`:设置标签的字体大小,默认为'12'。 6. `color`:设置标签的字体颜色,默认为'#666'。 7. `rotate`:设置标签的旋转角度,默认为0,表示不旋转。 `tooltip_formatter`是用于设置表的提示框格式化函数,它是一个函数对象,可以自定义函数的内容。在函数中,可以使用格式化字符串,如`{b}`表示节点名称,`{c}`表示节点值,`{d}`表示节点在数据中的索引等。 例如,可以通过设置`label_opts`来更改节点标签的显示位置和样式: ```python from pyecharts import options as opts from pyecharts.charts import Graph # 创建节点标签配置 label_opts = { "position": "top", "offset": [0, 0], "font_style": "normal", "font_weight": "normal", "font_size": 12, "color": "#666", "rotate": 0 } # 创建graph = Graph() graph.add("", nodes, links, label_opts=label_opts) # 显示graph.render() ``` 可以通过设置`tooltip_formatter`来自定义提示框的显示内容: ```python from pyecharts import options as opts from pyecharts.charts import Graph # 创建提示框格式化函数 def formatter(params): return "节点名称:" + params['name'] + "<br>" + \ "节点值:" + str(params['value']) + "<br>" + \ "节点索引:" + str(params['dataIndex']) # 创建graph = Graph() graph.add("", nodes, links, tooltip_formatter=formatter) # 显示graph.render() ``` 上述代码中的`nodes`和`links`分别表示节点和边的数据,具体数据格式请参考`pyecharts`的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西瓜WiFi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值