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

如何在Streamlit中更新Plotly Scatter3d图表而非生成新图表?

解决Plotly Scatter3d图表更新重复生成的问题

核心问题是你每次加载新数据时都重新创建了新的图表对象,而非修改已有图表的数据。以下分两种常见场景给出解决方法:

纯Plotly脚本(如Jupyter Notebook/本地脚本)

先创建初始图表并保存为变量,后续直接更新该变量的数据源,而非重新生成图表:

用Plotly Express的情况

import plotly.express as px
import pandas as pd

# 初始化第一个数据框与图表
df1 = pd.DataFrame({'x': [1,2,3], 'y': [4,5,6], 'z': [7,8,9]})
fig = px.scatter_3d(df1, x='x', y='y', z='z')
fig.show()

# 加载第二个数据框并更新现有图表
df2 = pd.DataFrame({'x': [10,11,12], 'y': [13,14,15], 'z': [16,17,18]})
# 直接替换trace的x、y、z数据
fig.data[0].x = df2['x']
fig.data[0].y = df2['y']
fig.data[0].z = df2['z']

# 可选:更新标题等布局属性
fig.update_layout(title='更新后的3D散点图')
fig.show()

用Graph Objects的情况

import plotly.graph_objects as go
import pandas as pd

# 初始化图表
df1 = pd.DataFrame({'x': [1,2,3], 'y': [4,5,6], 'z': [7,8,9]})
fig = go.Figure(data=[go.Scatter3d(x=df1['x'], y=df1['y'], z=df1['z'], mode='markers')])
fig.show()

# 更新数据
df2 = pd.DataFrame({'x': [10,11,12], 'y': [13,14,15], 'z': [16,17,18]})
fig.data[0].x = df2['x']
fig.data[0].y = df2['y']
fig.data[0].z = df2['z']

fig.show()

Dash交互式应用场景

如果是在Dash中开发网页应用,需通过回调函数更新已有dcc.Graph组件的figure属性,而非添加新的Graph组件:

import dash
from dash import dcc, html, Input, Output
import plotly.express as px
import pandas as pd

app = dash.Dash(__name__)

# 示例数据
df1 = pd.DataFrame({'x': [1,2,3], 'y': [4,5,6], 'z': [7,8,9]})
df2 = pd.DataFrame({'x': [10,11,12], 'y': [13,14,15], 'z': [16,17,18]})

app.layout = html.Div([
    dcc.Dropdown(
        id='data-picker',
        options=[
            {'label': '数据框1', 'value': 'df1'},
            {'label': '数据框2', 'value': 'df2'}
        ],
        value='df1'
    ),
    dcc.Graph(id='3d-scatter')
])

@app.callback(
    Output('3d-scatter', 'figure'),
    Input('data-picker', 'value')
)
def update_figure(selected_data):
    target_df = df1 if selected_data == 'df1' else df2
    # 复用图表结构,仅替换数据
    return px.scatter_3d(target_df, x='x', y='y', z='z')

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

关键注意点

  • 非Dash场景:始终操作同一个Figure对象,修改其data数组中的x/y/z值,避免重复调用px.scatter_3d()或go.Figure()生成新图表。
  • Dash场景:通过回调更新已有dcc.Graph的figure属性,确保组件复用,不要在回调中新增Graph元素。

内容的提问来源于stack exchange,提问作者Muhammed Sevinçtekin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:55:12