You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask中为Plotly/Dash对象添加双Y轴?

嘿,我来帮你搞定这个双Y轴图表的问题!你的核心问题在于没有把layout和data整合成完整的Plotly Figure对象就序列化了,另外第二个trace的yaxis='y2'也需要启用才能绑定到右侧Y轴。下面分两种方案给你解决:

在Flask中整合Plotly Layout的正确方法

你之前的代码只序列化了data数组,但Plotly前端渲染需要的是包含data和layout的完整Figure结构。修改步骤如下:

  1. 启用第二个Scatter trace的yaxis='y2'配置(你之前注释掉了,必须打开才能关联右侧Y轴)
  2. 用go.Figure()把data和layout封装成完整的Figure对象
  3. 序列化整个Figure对象,而不是单独的data数组

修改后的完整代码:

import numpy as np
import plotly.graph_objects as go
import json
from plotly.utils import PlotlyJSONEncoder

# 假设你已经有acoustic_data和time_to_failure的实际数据
# 这里用模拟数据演示
acoustic_data = np.random.rand(100)
time_to_failure = np.random.rand(100) * 10

xScale = np.linspace(0, 1, len(acoustic_data))
xScale2 = np.linspace(0, 1, len(time_to_failure))

# 创建图表轨迹
acoustic_trace = go.Scatter(
    x=xScale,
    y=acoustic_data,
    name='acoustic data'
)
time_trace = go.Scatter(
    x=xScale2,
    y=time_to_failure,
    name='time to failure',
    yaxis='y2'  # 关键:绑定到右侧Y轴
)

# 定义布局
layout = go.Layout(
    title='Earthquake',
    yaxis=dict(
        title='acoustic data'
    ),
    yaxis2=dict(
        title='time to failure',
        overlaying='y',
        side='right'
    )
)

# 整合data和layout为Figure对象
fig = go.Figure(data=[acoustic_trace, time_trace], layout=layout)

# 序列化整个Figure到JSON,供Flask前端渲染
graphJSON = json.dumps(fig, cls=PlotlyJSONEncoder)
return graphJSON

这样修改后,前端就能正确渲染带双Y轴的图表了。

用Dash实现双Y轴的简便方案

如果觉得Flask手动处理JSON太麻烦,Dash绝对是更简便的选择——它是Plotly官方推出的Web框架,专门用来快速构建交互式图表应用,完全不用手动处理序列化逻辑。

步骤如下:

  1. 先安装Dash:pip install dash
  2. 编写Dash应用代码,直接定义Figure并传给Graph组件即可

示例代码:

import numpy as np
import plotly.graph_objects as go
import dash
from dash import dcc, html

# 模拟数据(替换成你的实际数据)
acoustic_data = np.random.rand(100)
time_to_failure = np.random.rand(100) * 10
xScale = np.linspace(0, 1, len(acoustic_data))
xScale2 = np.linspace(0, 1, len(time_to_failure))

# 创建双Y轴图表的Figure
fig = go.Figure()
fig.add_trace(go.Scatter(
    x=xScale,
    y=acoustic_data,
    name='acoustic data'
))
fig.add_trace(go.Scatter(
    x=xScale2,
    y=time_to_failure,
    name='time to failure',
    yaxis='y2'
))
fig.update_layout(
    title='Earthquake',
    yaxis=dict(title='acoustic data'),
    yaxis2=dict(
        title='time to failure',
        overlaying='y',
        side='right'
    )
)

# 初始化Dash应用
app = dash.Dash(__name__)

# 定义应用布局,直接把Figure传给Graph组件
app.layout = html.Div([
    dcc.Graph(figure=fig)
])

if __name__ == '__main__':
    app.run_server(debug=True)

运行这段代码后,直接访问本地的http://127.0.0.1:8050就能看到带双Y轴的交互式图表了,Dash还自带缩放、拖拽、下载等交互功能,开发效率比Flask+Plotly高很多。

内容的提问来源于stack exchange,提问作者Frikster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:11:32