如何在Power BI中展示Python Plotly生成的桑基图,解决无可视化输出报错
问题原因
- 你使用的Plotly库的
fig.show()方法默认会调用系统浏览器渲染交互式图表,不会将图像输出到Power BI要求的Python默认绘图设备,因此Power BI无法检测到可视化输出,触发报错同时弹出浏览器。
修复现有代码的方案
首先提前安装依赖库:pip install kaleido(Plotly导出静态图的必需依赖)
修改后的代码如下,核心逻辑是把Plotly生成的桑基图转成静态图片后,用matplotlib渲染到Power BI可识别的默认绘图设备:
import pandas as pd import matplotlib.pyplot as plt import plotly.graph_objects as go from io import BytesIO df = dataset[['source', 'target', 'Value', 'label_s', 'label_t', 'cond', 'x_s', 'x_t']].copy().dropna() labels = dataset[['index', 'id', 'label', 'x', 'y']].copy().dropna() colors = dataset[['colors']].copy().dropna() x_scale = 1/7.5 y_scale = 1/10 link = dict(source=df.source, target=df.target, value=df.Value, color=colors.colors, hovertemplate='%{value}') node = dict(label=labels['label'], thickness=5, pad=50, color='gray', x=labels['x']*x_scale, y=labels['y']*y_scale) fig = go.Figure(go.Sankey(link=link, node=node, arrangement='fixed')) # 替换原有的fig.show()代码 # 先将Plotly图导出为png格式存到内存 img_bytes = fig.to_image(format="png", width=800, height=600) # 用matplotlib读取图片并输出到默认绘图设备 img = plt.imread(BytesIO(img_bytes)) plt.figure(figsize=(8,6)) plt.imshow(img) plt.axis('off') plt.show()
注意该方案输出的是静态桑基图,不支持悬停查看数值等交互效果。
更优实现方案
如果不需要自定义节点坐标这类高度定制化的需求,优先使用Power BI原生桑基图视觉对象:
- 直接在Power BI可视化面板中加载官方桑基图视觉,分别把对应字段拖入源、目标、值的配置栏即可生成,无需编写Python代码,渲染速度更快,还支持原生的交互筛选、钻取等功能。
如果必须用Python实现且需要保留自定义配置,也可以选择基于matplotlib的sankey模块开发,不需要额外做格式转换,直接输出即可被Power BI识别。
内容的提问来源于stack exchange,提问作者Meggy
相关产品推荐
相关产品推荐

