如何保存Jupyter中Plotly手动编辑后的交互式桑基图?
问题描述
我在Jupyter Notebook中用Plotly绘制桑基图,生成的初始图表如下:
每次都得手动调整图表,才能得到目标样式:
但我没法保存编辑后的版本——用fig.write_image()保存的始终是原始图表,不是调整后的。我的代码如下:
import pandas as pd import numpy as np import plotly import plotly.graph_objects as go 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) # Sankey plot setup data_trace = go.Sankey( arrangement = "snap", orientation = "h", valueformat = ".0f", node = dict( pad = 10, thickness = 30, line = dict( color = "black", width = 0.5 ), label = df_nodes['Label'].dropna(axis=0, how='any'), color = df_nodes['Color'] ), link = dict( arrowlen = 40, 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'), #label = df_links['Label'].dropna(axis=0, how='any'), #hoverinfo="all", #hovertemplate='Source: %{source.label}<br>Target: %{target.label}<br>Value: %{value}', ) ) layout = dict( title = "SENEK_Energiefluss_Diagramm", height = 750, width = 1000, font = dict( size = 10),) fig = go.Figure(data=[data_trace], layout=layout) fig.show()
解决方法
Plotly在Jupyter中手动调整的图表不会同步回Python的fig对象,所以直接用fig.write_image()只能保存原始配置。以下是三种可行的解决思路:
方案1:把手动调整的参数写入代码
这是最稳定的方式——直接在代码里定义你手动调整后的样式细节:
- 若调整了节点位置,可在
node字典中添加x和y参数,手动指定每个节点的坐标(范围0到1)。 - 若修改了布局、字体等其他细节,直接在
layout字典中更新对应参数。
示例:固定节点位置的代码修改
node = dict( pad = 10, thickness = 30, line = dict(color = "black", width = 0.5), label = df_nodes['Label'].dropna(axis=0, how='any'), color = df_nodes['Color'], x = [0, 0.3, 0.7, 1], # 手动指定每个节点的x轴位置 y = [0.1, 0.4, 0.6, 0.9] # 手动指定每个节点的y轴位置 )
方案2:导出HTML后再保存图片
- 先用
fig.write_html("sankey.html")将图表导出为HTML文件。 - 打开该HTML文件,手动调整到目标样式。
- 在浏览器中右键点击图表,选择「另存为图片」获取高清版本;也可使用专业截图工具截取。
方案3:使用Jupyter专属的FigureWidget
在Jupyter环境中,用plotly.graph_objects.FigureWidget替代go.Figure,手动调整的修改会同步回对象:
fig = go.FigureWidget(data=[data_trace], layout=layout) display(fig)
调整完成后,直接调用fig.write_image("sankey_edited.png")即可保存修改后的图表。
内容的提问来源于stack exchange,提问作者Karim Yosef Rezk
相关产品推荐
相关产品推荐

