数据可视化第二版-03部分-12章-网络

2023-10-16 17:14:54 浏览数 (2)

数据可视化第二版-03部分-12章-网络

总结

本系列博客为基于《数据可视化第二版》一书的教学资源博客。本文主要是第12章,网络案例相关。

可视化视角-相关

代码实现

安装依赖

代码语言:javascript复制
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tushare==1.2.89 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install mplfinance==0.12.9b7 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyheatmap==0.1.12  -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install networkx==3.1
网络图

参考:基于NetworkX构建复杂网络的应用案例

网络图1-networkx
代码语言:javascript复制
# 网络图
from matplotlib import pyplot as plt
import networkx as nx

G = nx.Graph()
G.add_nodes_from(["A", "B", "C", "D", "E", "F"])
G.add_edges_from([("A", "B"), ("A", "C"), ("A", "D"), ("B", "C"), ("B", "F"), ("C", "E"), ("D", "F")])
# with_labels是否显示标签,node_size节点大小,node_color节点颜色,node_shape节点形状,alpha透明度,linewidths线条宽度

# 左:跳跃式布局
nx.draw(G, with_labels=True, node_size=400, node_color="skyblue", node_shape="o", alpha=1, width=1, font_size=12,
        font_color="black")
plt.show()

# 中:环形布局
nx.draw(G, with_labels=True, node_size=400, node_color="skyblue", node_shape="o", alpha=1, width=1, font_size=12,
        font_color="black", pos=nx.circular_layout(G))
plt.show()

# 右:随机布局
nx.draw(G, with_labels=True, node_size=400, node_color="skyblue", node_shape="o", alpha=1, width=1, font_size=12,
        font_color="black", pos=nx.random_layout(G))
plt.show()

'''
networkx 画图参数:
- node_size: 指定节点的尺寸大小(默认是300)
- node_color: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜色,例如'r'为红色,'b'为绿色等,具体可查看手册),用“数据字典”赋值的时候必须对字典取值(.values())后再赋值
- node_shape: 节点的形状(默认是圆形,用字符串'o'标识,具体可查看手册)
- alpha: 透明度 (默认是1.0,不透明,0为完全透明)
- width: 边的宽度 (默认为1.0)
- edge_color: 边的颜色(默认为黑色)
- style: 边的样式(默认为实现,可选: solid|dashed|dotted,dashdot)
- with_labels: 节点是否带标签(默认为True)
- font_size: 节点标签字体大小 (默认为12)
- font_color: 节点标签字体颜色(默认为黑色)
e.g. nx.draw(G,node_size = 30, with_label = False)
绘制节点的尺寸为30,不带标签的网络图。

布局指定节点排列形式
pos = nx.spring_layout
建立布局,对图进行布局美化,networkx 提供的布局方式有:
- circular_layout:节点在一个圆环上均匀分布
- random_layout:节点随机分布
- shell_layout:节点在同心圆上分布
- spring_layout: 用Fruchterman-Reingold算法排列节点
- spectral_layout:根据图的拉普拉斯特征向量排列节
布局也可用pos参数指定,例如,nx.draw(G, pos = spring_layout(G)) 这样指定了networkx上以中心放射状分布.
'''

输出为:

弧形图
环形弧形长链接图
代码语言:javascript复制
# -*- coding: utf-8 -*-
"""
@reference
https://gallery.pyecharts.org/#/Graph/graph_les_miserables
https://github.com/pyecharts/pyecharts-gallery/blob/master/Graph/les-miserables.json
"""

import json

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

import os
os.chdir(os.path.dirname(__file__))

with open("les-miserables.json", "r", encoding="utf-8") as f:
    j = json.load(f)
    nodes = j["nodes"]
    links = j["links"]
    categories = j["categories"]

c = (
    Graph(init_opts=opts.InitOpts(width="1000px", height="600px"))
    .add(
        "",
        nodes=nodes,
        links=links,
        categories=categories,
        layout="circular",
        is_rotate_label=True,
        linestyle_opts=opts.LineStyleOpts(color="source", curve=0.3),
        label_opts=opts.LabelOpts(position="right"),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Graph-Les Miserables"),
        legend_opts=opts.LegendOpts(orient="vertical", pos_left="2%", pos_top="20%"),
    )
    .render("graph_les_miserables.html")
)


import os

os.system("graph_les_miserables.html")

输出为:

桑基图
桑基图1-
代码语言:javascript复制
# -*- coding: utf-8 -*-
"""
@reference: 
https://pyecharts.org/#/zh-cn/basic_charts?id=sankey:桑基图
https://gallery.pyecharts.org/#/Sankey/sankey_base
"""

from pyecharts import options as opts
from pyecharts.charts import Sankey

# 内置主题类型可查看 pyecharts.globals.ThemeType
"""
from pyecharts.globals import ThemeType
"""

nodes = [
    {"name": "category1"},
    {"name": "category2"},
    {"name": "category3"},
    {"name": "category4"},
    {"name": "category5"},
    {"name": "category6"},
]

links = [
    {"source": "category1", "target": "category3", "value": 10},
    {"source": "category1", "target": "category4", "value": 15},
    {"source": "category2", "target": "category3", "value": 10},
    {"source": "category2", "target": "category4", "value": 10},
    {"source": "category3", "target": "category5", "value": 20},
    {"source": "category4", "target": "category5", "value": 10},
    {"source": "category4", "target": "category6", "value": 15},
]
# pyecharts V1 版本开始所有方法均支持链式调用。
sankey = (
    Sankey()  # 试试变换主题:Sankey(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)),参考:进阶话题-定制主题
        .add(
        "sankey",
        nodes,
        links,
        linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
        label_opts=opts.LabelOpts(position="right"),  # 节点标签位置可选,参考:配置项-系列配置项-标签配置项
    )
        .set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"))
        # 或者直接使用字典参数
        # .set_global_opts(title_opts={"text": "主标题", "subtext": "副标题"})
        .render("sankey_base_2.html")
    # render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
    # 也可以传入路径参数,如 Sankey.render("sankey_base.html")
)

import os
os.system("sankey_base_2.html")

# 不习惯链式调用的开发者依旧可以单独调用方法
"""
sankey = Sankey()
sankey.add("sankey",
      nodes,
      links,
      linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
      label_opts=opts.LabelOpts(position="right"),
    )
sankey.set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"))
sankey.render("sankey_base.html")
"""

# 渲染成图片文件
"""
from pyecharts.render import make_snapshot
# 使用 snapshot-selenium 渲染图片(需安装)
from snapshot_selenium import snapshot
make_snapshot(snapshot, sankey, "sankey_base.png")#sankey为html文件
#snapshot-selenium 报错处理可参考:https://blog.csdn.net/snwang_miss/article/details/117728949
"""
桑基图2-
代码语言:javascript复制
from pyecharts import options as opts
from pyecharts.charts import Sankey

nodes = [
    {"name": "category1"},
    {"name": "category2"},
    {"name": "category3"},
    {"name": "category4"},
    {"name": "category5"},
    {"name": "category6"},
]

links = [
    {"source": "category1", "target": "category3", "value": 10},
    {"source": "category1", "target": "category4", "value": 15},
    {"source": "category2", "target": "category3", "value": 10},
    {"source": "category2", "target": "category4", "value": 10},
    {"source": "category3", "target": "category5", "value": 20},
    {"source": "category4", "target": "category5", "value": 10},
    {"source": "category4", "target": "category6", "value": 15},
]

sankey = (
    Sankey()
    .add(
        "sankey",
        nodes,
        links,
        linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
        label_opts=opts.LabelOpts(position="right"),#节点标签位置
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"))
    .render("sankey_base.html")
)


import os
os.system("sankey_base.html")
桑基图3-
代码语言:javascript复制
from pyecharts import options as opts
from pyecharts.charts import Sankey
# 内置主题类型可查看 pyecharts.globals.ThemeType
from pyecharts.globals import ThemeType

nodes = [
    {"name": "category1"},
    {"name": "category2"},
    {"name": "category3"},
    {"name": "category4"},
    {"name": "category5"},
    {"name": "category6"},
]

links = [
    {"source": "category1", "target": "category3", "value": 10},
    {"source": "category1", "target": "category4", "value": 15},
    {"source": "category2", "target": "category3", "value": 10},
    {"source": "category2", "target": "category4", "value": 10},
    {"source": "category3", "target": "category5", "value": 20},
    {"source": "category4", "target": "category5", "value": 10},
    {"source": "category4", "target": "category6", "value": 15},
]

sankey_vertical = (
    Sankey(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add(
        "sankey",
        nodes,
        links,
        # Sankey 组件离容器外侧的距离 types.Union[str, types.Numeric]:默认值:pos_left="5%",pos_right="20%",
        pos_left="20%",
        orient="vertical",
        linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
        label_opts=opts.LabelOpts(position="inside"),#节点标签位置可选,参考:配置项-系列配置项-标签配置项
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="Sankey-Vertical"))
    .render("sankey_vertical.html")
)


import os
os.system("sankey_vertical.html")

有趣的可视化

https://plotapi.com/#billing_interval

教材截图

0 人点赞