如何生成包含子图的Plotly Chart Studio分享链接
问题原因
chart_studio.plotly.plot() 接口原生不支持直接传入Figure对象列表生成多图分享链接,你之前传入单个图表能运行,是因为这个接口的入参要求必须是单个完整的Plotly Figure对象,直接传列表会触发参数校验错误。
另外你贴的初始代码里有两处容易踩坑的小问题:一是dcc.Grapgh拼写错误,正确写法是dcc.Graph;二是go.Bar()、go.Indicator()生成的是Trace轨迹对象,不是完整Figure,不管是本地Dash渲染还是上传Chart Studio,最好都包装成完整Figure对象再调用,避免出现渲染异常。
实现方案
根据你要的分享效果选对应方案即可:
方案1:生成单个分享链接,打开即可看到全部三张图
用Plotly自带的make_subplots方法把三张图组合到同一个Figure对象里,再上传到Chart Studio就能拿到单链接。注意Indicator这类指标组件需要单独指定布局占位列,否则会和其他图表重叠,参考代码:
import chart_studio.plotly as py import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.express as px def funct(data, x_data, y_data ): # 初始化3行1列的子图布局,给不同类型的图表指定对应类型 fig = make_subplots( rows=3, cols=1, specs=[ [{"type": "xy"}], # 第一行放折线图 [{"type": "indicator"}], # 第二行放计数指标卡 [{"type": "xy"}] # 第三行放柱状图 ], subplot_titles=("Trend Line", "Total Count", "Bar Chart") ) # 逐个添加图表内容 line_fig = px.line(x=x_data, y=y_data) fig.add_trace(line_fig.data[0], row=1, col=1) indi_fig = go.Indicator(value = len(data), title='Total Count') fig.add_trace(indi_fig.data[0], row=2, col=1) # 手动指定指标卡的坐标轴范围,避免显示错位 fig.update_yaxes(domain=[0.4, 0.6], row=2, col=1) bar_trace = go.Bar(x=x_data, y=y_data) fig.add_trace(bar_trace, row=3, col=1) # 调整整体高度,防止图表挤压 fig.update_layout(height=900, showlegend=False) # 上传单个组合好的Figure,生成可访问的分享链接 return py.plot(fig, auto_open=True)
方案2:保留三个图表的独立自定义布局,分别生成链接
如果你不想把三张图拼到同一个子图容器里,要和之前Dash里的自定义布局效果完全一致,就把三个图表分别包装成独立Figure,逐个调用py.plot()上传拿到三个独立链接,之后你可以自己写个简单的嵌入页,按你要的排版把三个图表的iframe嵌进去就行,参考代码:
import chart_studio.plotly as py import plotly.graph_objects as go import plotly.express as px def funct(data, x_data, y_data ): # 每个图表都包装成独立的完整Figure对象 line_fig = px.line(x=x_data, y=y_data, title="Trend Line") indi_fig = go.Figure(go.Indicator(value = len(data), title='Total Count')) bar_fig = go.Figure(go.Bar(x=x_data, y=y_data)) # 分别上传,关闭自动打开,拿到三个独立链接 line_share_url = py.plot(line_fig, auto_open=False, filename="trend-line-chart") indi_share_url = py.plot(indi_fig, auto_open=False, filename="total-count-indicator") bar_share_url = py.plot(bar_fig, auto_open=False, filename="bar-chart") # 后续可以按你需要的布局拼接展示页 return line_share_url, indi_share_url, bar_share_url
小提示:上传时可以通过
filename参数指定图表在Chart Studio仓库里的文件名,方便后续管理。
内容的提问来源于stack exchange,提问作者Ritesh Kankonkar
相关产品推荐
相关产品推荐

