Matplotlib - Sankey 类



matplotlib 中的Sankey 类用于创建桑基图,在深入研究 Sankey 类之前,了解桑基图的基础知识至关重要。

桑基图是一种强大的可视化工具,用于表示资源、能量或信息在不同实体或过程之间的流动。它使用不同宽度的箭头来表示流动的数量,宽度与表示的数量成比例。请参见下面的图片,了解简单桑基图的参考。

sankey_class_intro

桑基图的关键组成部分

  • 节点 - 发生流动之间的实体或过程。

  • - 连接节点的箭头,表示流动的数量。

  • 标签 - 与节点或流相关的描述。

Matplotlib 中的 Sankey 类

在 Matplotlib 中,Sankey() 类提供了一种方便的方法来创建这些图表。以下是该类的语法:

语法

class matplotlib.sankey.Sankey(ax=None, scale=1.0, unit='', format='%G', gap=0.25, radius=0.1, shoulder=0.03, offset=0.15, head_angle=100, margin=0.4, tolerance=1e-06, **kwargs)

以下是使用 matplotlib Sankey 类创建桑基图的步骤:

  • 创建 Sankey 对象 - 这可以通过使用 Sankey() 类来完成,该类初始化 Sankey 类的实例,该实例将用于构建图表。

  • 添加流和标签 - Sankey.add() 方法用于指定流和标签。

  • 完成和显示 - Sankey.finish() 方法完成图表,plt.show() 显示图表。

绘制基本的桑基图

现在,让我们使用默认设置构建一个简单的桑基图。下面的示例创建一个具有一个输入和一个输出流的图表。流使用flows参数指定,标签使用labels参数提供。

示例 1

这是一个创建具有一个输入和一个输出流的桑基图的示例。

import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
sankey = Sankey()
sankey.add(flows=[1, -1],
   labels=['input', 'output'])
plt.title("Sankey Diagram")
sankey.finish()
plt.show()

输出

执行上述程序后,将生成以下桑基图:

sankey_class_ex1

示例 2

另一个示例演示了如何通过隐式调用 Sankey.add() 方法并将 finish() 附加到对该类的调用来创建简单的图表。
import matplotlib.pyplot as plt

from matplotlib.sankey import Sankey
Sankey(flows=[0.25, 0.15, 0.60, -0.20, -0.15, -0.05, -0.50, -0.10],
   labels=['', '', '', 'First', 'Second', 'Third', 'Fourth', 'Fifth'],
   orientations=[-1, 1, 0, 1, 1, 1, 0, -1]).finish()
plt.title("The default settings produce a diagram like this.")
plt.show()

输出

执行上述程序后,将生成以下桑基图:

sankey_class_ex2

自定义桑基图

Matplotlib Sankey 类提供更多自定义选项,包括将多个桑基图连接在一起,在图表中间放置标签,隐式地将关键字参数传递给 PathPatch(),更改箭头头的角度,更改创建图表后补丁和标签的外观等等。

示例

这是一个使用 matplotlib sankey() 类创建复杂的自定义桑基图的示例。

import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey

# Create a subplot
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[], title="Customized Sankey Diagram with Two Systems")

# Create a Sankey diagram
sankey = Sankey(ax=ax, scale=0.01, offset=0.2, format='%.0f', unit='%')

# Add flows and labels for the first system
sankey.add(flows=[25, 0, 60, -10, -20, -5, -15, -10, -40], label='one',
   labels=['', '', '', 'First', 'Second', 'Third', 'Fourth','Fifth', 'Hurray!'],
   orientations=[-1, 1, 0, 1, 1, 1, -1, -1, 0],
   pathlengths=[0.25, 0.25, 0.25, 0.25, 0.25, 0.6, 0.25, 0.25, 0.25],
   patchlabel="Widget\nA")

# Add flows and labels for the second system, connected to the first
sankey.add(flows=[-25, 15, 10], label='two',
   orientations=[-1, -1, -1], prior=0, connect=(0, 0))

# Finish the Sankey diagram and apply customizations
diagrams = sankey.finish()
diagrams[-1].patch.set_hatch('/')
diagrams[0].texts[-1].set_color('r')
diagrams[0].text.set_fontweight('bold')

# Display the diagram
plt.legend()
plt.show()

输出

执行上述程序后,将生成以下桑基图:

sankey_class_ex3
广告