漂亮的桑基图还能这么用!
桑基图,起源于19世纪,是一种独特的流图,用于表示在多个实体或阶段间的流量或数值转移。随着时间的推移,这种图表已经从原来的简单表示能源流量演变为多种应用的强大工具。其独特的视觉效果和线的宽度与流量量成正比的特点,使其在视觉上直观地传达了数据的重要信息。从能源管理到网站流量分析,桑基图都为我们提供了深入洞察和理解复杂数据的窗口。
桑基图是一种流图,用于表示在两个或多个节点集之间的流量。桑基图特别适用于表示源和目标之间的流量量,因为它的线宽与流量量成正比。
桑基图的一些常见应用:
能源流量:展示能源从源头到最终用户的流动,例如太阳能如何被转化为电力和热能。 成本结构:显示产品的成本如何分配到不同的部分。 网站流量:追踪用户如何在网站上导航。 交易流量:展示金钱、商品或服务如何在多个实体间流动。 数据迁移:在多个数据库或服务器间追踪数据流。 混淆矩阵:预测值与真实值的对比。
举个例子:假设我们有一个在线商店,我们想追踪用户如何在商店中导航。具体来说,我们想知道用户是如何从主页到产品页面,然后到购物车,最后到结算页面的。
以下是使用plotly库实现的例子:
import plotly.graph_objects as go
# 数据定义
labels = ["Homepage", "Product Page", "Cart", "Checkout", "Exit"]
source = [0, 0, 1, 1, 1, 2, 2, 2, 3]
target = [1, 4, 2, 3, 4, 3, 4, 1, 4]
value = [100, 10, 50, 30, 20, 40, 5, 5, 35]
# 创建桑基图
fig = go.Figure(data=[go.Sankey(
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = labels
),
link = dict(
source = source,
target = target,
value = value
))])
fig.show()
上述代码将显示一个桑基图,描述用户如何从主页到结算页面,以及在哪些步骤中流失了用户。
能源流量
假设我们要展示太阳能是如何被转化为电力和热能的。
import plotly.graph_objects as go
# 数据
labels = ["Solar Energy", "Conversion System", "Electrical Energy", "Thermal Energy"]
source = [0, 0, 1, 1]
target = [1, 1, 2, 3]
value = [100, 100, 60, 40]
# 创建桑基图
fig = go.Figure(go.Sankey(
node=dict(label=labels),
link=dict(source=source, target=target, value=value)
))
fig.update_layout(title_text="Solar Energy Conversion")
fig.show()
成本结构
考虑一款手机的制造成本。
labels = ["Total Cost", "Components", "Labor", "Marketing", "Others"]
source = [0, 0, 0, 0]
target = [1, 2, 3, 4]
value = [300, 50, 100, 50]
fig = go.Figure(go.Sankey(
node=dict(label=labels),
link=dict(source=source, target=target, value=value)
))
fig.update_layout(title_text="Phone Manufacturing Cost Structure")
fig.show()
交易流量
考虑一个简单的金钱流。
labels = ["Bank", "Online Store", "Physical Store", "Taxes"]
source = [0, 0, 1]
target = [1, 2, 3]
value = [150, 50, 40]
fig = go.Figure(go.Sankey(
node=dict(label=labels),
link=dict(source=source, target=target, value=value)
))
fig.update_layout(title_text="Money Flow")
fig.show()
数据迁移
考虑从一个数据库迁移到另一个的数据流。
labels = ["Database A", "Database B", "Errors", "Success"]
source = [0, 0, 1]
target = [1, 2, 3]
value = [200, 5, 195]
fig = go.Figure(go.Sankey(
node=dict(label=labels),
link=dict(source=source, target=target, value=value)
))
fig.update_layout(title_text="Data Migration")
fig.show()
混淆矩阵
在这部分,我们使用桑基图来可视化一个二分类问题的混淆矩阵。我们定义了实际的正例和负例与预测的正例和负例之间的流量。
labels = ["Actual Positive", "Actual Negative", "Predicted Positive", "Predicted Negative"]
source = [0, 0, 1, 1]
target = [2, 3, 3, 2]
value = [40, 10, 5, 45]
fig = go.Figure(go.Sankey(
node=dict(label=labels),
link=dict(source=source, target=target, value=value)
))
fig.update_layout(title_text="Confusion Matrix Visualization")
fig.show()
plotly
绘制桑基图
以下是使用plotly绘制桑基图的原理:
节点(Node):桑基图中的每一个单独的点都称为一个节点。在plotly中,节点通过labels列表定义,它包含所有节点的名称。
链接(Link):链接表示从一个节点到另一个节点的流量。每个链接都有一个源节点、一个目标节点和一个表示流量量的值。
源(Source):每个链接的起始节点。在plotly中,源是source列表中的索引值,该列表指向labels列表中的相应节点。
目标(Target):每个链接的结束节点。在plotly中,目标是target列表中的索引值,该列表指向labels列表中的相应节点。
值(Value):表示从源到目标的流量量。在plotly中,使用value列表来指定每个链接的值。
布局和样式:您可以进一步定制桑基图的外观,例如节点和链接的颜色、线的厚度等。plotly提供了多种参数和设置来调整图的外观。
使用plotly创建桑基图的基本步骤如下:
定义所有的节点标签。 指定源、目标和值以创建链接。 使用go.Sankey方法创建桑基图对象。 使用update_layout方法进一步定制图的外观。 使用show方法显示图。
桑基图的绘制基于流的量来确定每个链接的宽度。更大的流量值会导致更宽的链接,从而直观地表示流量的大小。
无论你是数据科学家、市场研究员还是只是一个对数据可视化感兴趣的人,都应该探索和利用桑基图的强大功能,以更好地理解和传达你的数据故事。
快来试试吧!