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

Docker容器中Streamlit应用的Plotly图表格式异常求助

问题原因与解决方案

核心原因

本地开发环境与Docker容器内的Plotly/Streamlit依赖版本不匹配是导致样式差异的主要原因。如果你的requirements.txt未指定精确版本,Docker会自动拉取对应包的最新稳定版,而本地使用的是Python 3.9.7配套的旧版本——不同版本的Plotly默认模板、渲染逻辑,以及Streamlit对Plotly图表的适配规则都可能存在差异,直接导致样式表现不一致。

另外,仅设置pio.templates.default='plotly'无效的原因是:部分Plotly/Streamlit版本会在渲染时覆盖全局模板设置,或者新版本的"plotly"模板本身就调整了默认样式。


解决方案

1. 锁定依赖版本,确保环境一致

将本地开发环境的精确依赖版本导出,替换原requirements.txt,保证Docker安装的包版本与本地完全相同:

  • 在本地终端执行:
    pip freeze > requirements.txt
    
  • 打开生成的requirements.txt,保留与Plotly、Streamlit相关的精确版本条目(比如plotly==5.10.0、streamlit==1.16.0),删除无关依赖。

2. 显式硬编码所有样式参数,不依赖默认模板

直接在代码中指定所有需要的样式,避免依赖版本间的默认样式差异:

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import streamlit as st

# 创建子图
fig = make_subplots(rows=2, cols=1)
fig.add_trace(go.Scatter(x=[1,2,3], y=[4,5,6]), row=1, col=1)
fig.add_trace(go.Bar(x=[1,2,3], y=[7,8,9]), row=2, col=1)

# 显式定义全局布局样式
fig.update_layout(
    title="自定义样式图表",
    title_font=dict(family="Arial", size=18, color="#333333"),  # 标题字体
    width=850,  # 图表宽度
    height=800,
    plot_bgcolor="#ffffff",  # 绘图背景色
    vertical_spacing=0.15,  # 子图垂直间距
)

# 定义坐标轴网格线样式
fig.update_xaxes(
    showgrid=True,
    gridcolor="#dddddd",
    gridwidth=1,
    tickfont=dict(family="Arial", size=12)
)
fig.update_yaxes(
    showgrid=True,
    gridcolor="#dddddd",
    gridwidth=1,
    tickfont=dict(family="Arial", size=12)
)

st.plotly_chart(fig, use_container_width=False)  # 禁用容器宽度自适应,保证宽度固定

3. 验证Docker内的依赖版本

在Dockerfile中添加依赖列表输出步骤,确认容器内的包版本与本地一致:

# 原有Dockerfile内容...
RUN pip install -r requirements.txt
# 添加这行,导出包列表
RUN pip list > /app/package_versions.txt

构建并运行容器后,查看/app/package_versions.txt文件,对比本地pip freeze的输出,确保Plotly、Streamlit版本完全匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:37:21