如何基于给定DataFrame使用Plotly绘制桑基图?
用Plotly绘制桑基图的解决方案
没问题,我来帮你搞定这个桑基图的绘制!Plotly的桑基图要求把文本形式的源、目标标签转换成数字索引,这大概率是你之前操作失败的关键原因。下面是针对你的DataFrame的完整可运行代码:
import pandas as pd import plotly.graph_objects as go # 创建你提供的DataFrame df = pd.DataFrame({ "Vendor Name": ["AKJ Education", "AKJ Education", "Amazon", "Amazon", "Amazon", "Flipkart"], "Category": ["Books", "Computers & Tablets", "Books", "Computers & Tablets", "Other", "Books"], "Count": [846888, 1045, 1294423, 42165, 415, 1023] }) # 第一步:生成所有唯一的节点标签(源+目标) all_labels = pd.concat([df["Vendor Name"], df["Category"]]).unique() # 第二步:创建标签到数字索引的映射 label_to_id = {label: idx for idx, label in enumerate(all_labels)} # 第三步:把DataFrame中的源和目标转换成对应的索引 df["source_id"] = df["Vendor Name"].map(label_to_id) df["target_id"] = df["Category"].map(label_to_id) # 第四步:构建桑基图 fig = go.Figure(data=[go.Sankey( node = dict( pad = 15, thickness = 20, line = dict(color = "black", width = 0.5), label = all_labels, color = "blue" ), link = dict( source = df["source_id"], target = df["target_id"], value = df["Count"], # 可选:让链接颜色和源节点色调一致,增强可读性 color = [f"rgba(0,0,255,{0.3 + i/len(df)*0.5})" for i in range(len(df))] ) )]) # 设置图表标题 fig.update_layout(title_text="供应商-品类流量桑基图", font_size=12) # 展示图表 fig.show()
关键步骤解释:
- 标签转索引:Plotly的桑基图不直接支持文本作为
source和target,必须用节点在label列表中的索引值,所以我们先把所有唯一的供应商和品类合并成一个列表,再给每个标签分配ID。 - 节点配置:
node参数里的pad控制节点间距,thickness控制节点宽度,label就是我们之前生成的所有唯一标签。 - 链接配置:
link里的source、target对应转换后的索引,value就是你的Count列,用来控制流量宽度。
运行这段代码后,你就能看到符合需求的桑基图了,每个供应商到对应品类的流量宽度会根据Count值自动调整~
内容的提问来源于stack exchange,提问作者user517696
相关产品推荐
相关产品推荐

