Python Plotly 如何使用Pandas dataframe定义Sankey图的结构
Sankey图用于通过定义“源”表示源节点和“目标”表示目标节点来可视化流动。它用于表示不同数据点之间对象的流动。
在本教程中,让我们了解如何使用dataframe定义Sankey图的结构。在这里,我们将使用 plotly.graph_objects 模块生成图表。它包含了生成图表的许多方法。
步骤1
导入 plotly.graphs_objs 模块,并将其别名为 go 。
import plotly.graphs_objs as go
步骤2
导入Pandas模块并别名为 pd.
import pandas as pd
步骤3
创建一个拥有“id”,“label”和“color”坐标的二维节点列表 –
nodes = [
['id', 'label', 'color'],
[ 0, 'A1', 'blue'],
[ 1, 'A2', 'green'],
[ 2, 'B1', 'red'],
[ 3, 'B2', 'brown'],
[ 4, 'C1', 'cyan'],
[ 5, 'C2', 'yellow']
]
步骤4
根据下面的定义,创建一个包含”source”、”target”、”value”和”link color”的二维链接列表。
links = [
['Source', 'Target', 'Value', 'Link Color'],
[ 0, 2, 4, 'grey'],
[ 0, 3, 4, 'grey'],
[ 1, 3, 4, 'grey'],
[ 2, 4, 4, 'grey'],
[ 3, 4, 4, 'grey'],
[ 3, 5, 4, 'grey']
]
步骤5
计算节点和链接的标题,并生成两个数据帧,分别用于节点和链接。
nodes_headers = nodes.pop(0)
links_headers = links.pop(0)
df_nodes = pd.DataFrame(nodes, columns = nodes_headers)
df_links = pd.DataFrame(links, columns = links_headers)
步骤6
接下来,创建桑基图。将数据帧节点添加到桑基图中,并设置其颜色和厚度值。
fig = go.Figure(data=[go.Sankey(
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = df_nodes['label'].dropna(axis=0, how='any'),
color = df_nodes['color']),
步骤7
生成以下所示的“source”、“target”、“value”和“link colors”的链接-
link = dict(
source = df_links['Source'].dropna(axis=0, how='any'),
target = df_links['Target'].dropna(axis=0, how='any'),
value = df_links['Value'].dropna(axis=0, how='any'),
color = df_links['Link Color'].dropna(axis=0, how='any'),
)
步骤8
使用 update_layout() 方法来设置桑基图的标题。最后,使用 fig.show() 展示图表。
fig.update_layout(
title_text="DataFrame-Sankey diagram",
font_size=10
)
fig.show()
示例
使用Pandas数据框定义桑基图结构的完整代码如下-
import plotly.graph_objects as go
import pandas as pd
nodes = [
['id', 'label', 'color'],
[0, 'A1', 'blue'],
[1, 'A2', 'green'],
[2, 'B1', 'red'],
[3, 'B2', 'brown'],
[4, 'C1', 'cyan'],
[5, 'C2', 'yellow']
]
links = [
['Source', 'Target', 'Value', 'Link Color'],
[0, 2, 4, 'grey'],
[0, 3, 4, 'grey'],
[1, 3, 4, 'grey'],
[2, 4, 4, 'grey'],
[3, 4, 4, 'grey'],
[3, 5, 4, 'grey']
]
# Retrieve headers and build dataframes
nodes_headers = nodes.pop(0)
links_headers = links.pop(0)
df_nodes = pd.DataFrame(nodes, columns=nodes_headers)
df_links = pd.DataFrame(links, columns=links_headers)
fig = go.Figure(data=[go.Sankey(
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = df_nodes['label'].dropna(axis=0, how='any'),
color = df_nodes['color']
),
link = dict(
source=df_links['Source'].dropna(axis=0, how='any'),
target=df_links['Target'].dropna(axis=0, how='any'),
value=df_links['Value'].dropna(axis=0, how='any'),
color=df_links['Link Color'].dropna(axis=0, how='any'),
)
)])
fig.update_layout(
title_text="DataFrame-Sankey diagram",
font_size=10
)
fig.show()
输出
在执行时,它将在浏览器上显示以下输出 –