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
相关产品推荐
相关产品推荐

