plotly绘图——桑基图

本文介绍了如何使用Python库plotly创建基本桑基图,以及如何添加彩色链接和箭头链接以增强可视化效果。通过实例代码展示了从基础到高级特性的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

plotly是一个易于使用,功能强大的python绘图库,用于构建可交互式的图表(可以自行运行后使用鼠标拖拽图片试试),本系列文章将介绍plotly绘制各种类型图的方法,本文将介绍——桑基图

桑基图

基础桑基图

代码解释

  • 首先,导入Plotly库中的graph_objects模块,这个模块包含了创建图表所需的各种图形对象。
  • 创建一个Figure对象,并定义了一个Sankey图形对象作为这个Figure的子图。
    node属性定义了桑基图中的节点(也称为“框”),其中:
    pad设置了节点之间的填充大小。
    thickness设置了节点的宽度。
    line是一个字典,设置了节点边框的颜色和宽度。
    label是一个列表,包含了每个节点的名称。
    color设置了所有节点的统一颜色。
    link属性定义了桑基图中的链接(也称为“箭头”),其中:
    source是一个列表,表示链接的起始节点的索引。
    target是一个列表,表示链接的结束节点的索引。
    value是一个列表,表示链接的宽度,通常代表流动的量。
  • 使用update_layout方法设置图表的布局,title_text设置了图表标题为"Basic Sankey Diagram",font_size设置了字体大小为10。
import plotly.graph_objects as go

fig = go.Figure(data=[go.Sankey(
    node = dict(
      pad = 15,
      thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = ["A1", "A2", "B1", "B2", "C1", "C2"],
      color = "blue"
    ),
    link = dict(
      source = [0, 1, 0, 2, 3, 3], # indices correspond to labels, eg A1, A2, A1, B1, ...
      target = [2, 3, 3, 4, 4, 5],
      value = [8, 4, 2, 8, 4
桑基图(Sankey Diagram)是一种特定类型的流程图,它主要用于展示物料、能量或其他量在不同过程之间的流动情况。每一条带宽代表了流量大小,并且随着路径的变化而变化。使用 Plotly 绘制桑基图可以非常直观地呈现这种信息。 以下是利用 Python 和 Plotly 库绘制桑基图的基本步骤及示例代码: ### 步骤一:安装并导入必要的库 首先需要确保已经安装了 `plotly` 包。如果还没有安装的话,可以通过 pip 工具轻松完成: ```bash pip install plotly ``` 然后在脚本开头引入所需的模块: ```python import plotly.graph_objs as go ``` ### 步骤二:准备数据节点和链接 为了构建一张完整的桑基图,我们需要准备好两个列表——一个是包含所有节点的信息,另一个则是各个节点间的连接及其对应的流值。每个节点都有唯一的标识符 ID 以及显示名称;而对于每一对源-目标节点之间存在多少“流量”,则记录在一个字典中作为边的权重。 ```python nodes = [ {"id": "A", "label": "起点 A"}, {"id": "B", "label": "中途 B"}, {"id": "C", "label": "终点 C"} ] links = [ {'source': 'A', 'target': 'B', 'value': 5}, {'source': 'B', 'target': 'C', 'value': 3} ] ``` ### 步骤三:转换成适合 Plotly 使用的形式 Plotly 接受整数索引来指代各节点的位置,因此这里还需要将字符串形式的 node id 映射到数组下标上。同时也要构造出一个与 links 数组结构相匹配的新版本,其中 source/target 均应替换为对应于 nodes 列表里的 index 而非原始名字。 ```python node_indices = {n['id']: i for i, n in enumerate(nodes)} formatted_links = [{ 'source': node_indices[l['source']], 'target': node_indices[l['target']], 'value': l['value'] } for l in links] ``` ### 步骤四:生成图形对象并与之交互 最后一步就是创建 Sankey 类型的数据集并将上述整理好的内容传递进去形成最终可视化效果啦~记得调用 `.show()` 方法查看成果哦! ```python fig = go.Figure(data=[ go.Sankey( arrangement='snap', # 节点排列方式 ('freeform'|'fixed'|'perpendicular'|'straight'|'snap') node={ "pad": 15, "thickness": 20, "line": dict(color="black", width=0.5), "label": [n["label"] for n in nodes], }, link={ "source": [link['source'] for link in formatted_links], # 源节点ID序列 "target": [link['target'] for link in formatted_links], # 目标节点ID序列 "value": [link['value'] for link in formatted_links] # 流动数值序列 } ) ]) fig.update_layout(title_text="简单桑基图演示") fig.show() ``` 此段代码将会渲染出一幅基础版的桑基图,用户可以根据实际需求进一步调整样式选项或增加更多复杂功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值