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

Dash Plotly图片在Jupyter正常显示但浏览器不渲染问题排查

为什么你的Plotly图片在Dash里显示空白?

我一眼就看出问题所在了——Jupyter和Dash对本地图片的加载逻辑完全不一样!

在Jupyter Notebook里,代码是直接在你的本地环境运行的,读取logo.png这种相对路径的本地文件毫无压力。但Dash是个Web应用,当你在浏览器访问时,浏览器是从Dash服务器请求资源的,你直接写source="logo.png",服务器根本不知道这个文件在哪,浏览器自然加载不到图片,就显示空白块了。

下面给你两种靠谱的解决方法,选哪种都行:

方法1:用Dash默认的静态资源目录(推荐)

Dash有个默认的静态资源目录规则,只要你按要求放文件,它会自动帮你处理资源路径:

  • 第一步:在你的Dash项目根目录下,新建一个名为assets的文件夹(名字必须是这个,Dash会自动识别)
  • 第二步:把你的logo.png图片移动到这个assets文件夹里
  • 第三步:修改Figure里的图片路径,把source="logo.png"改成source="/assets/logo.png"

修改后的图片添加代码片段:

fig.add_layout_image(
 go.layout.Image(
 x=0,
 sizex=img_width * scale_factor,
 y=img_height * scale_factor,
 sizey=img_height * scale_factor,
 xref="x",
 yref="y",
 opacity=1.0,
 layer="below",
 sizing="stretch",
 source="/assets/logo.png")  # 这里修改路径
)

方法2:把图片转成Base64编码嵌入(无需额外文件夹)

如果你不想新建assets目录,可以把图片转为Base64字符串,直接嵌入到Figure里,这样就不需要依赖外部文件了:
首先导入base64模块,然后读取图片并编码,最后把编码后的字符串作为source值:

import base64

# 读取图片并转为Base64编码
with open("logo.png", "rb") as img_file:
    encoded_img = base64.b64encode(img_file.read()).decode()

# 修改图片的source属性
fig.add_layout_image(
 go.layout.Image(
 x=0,
 sizex=img_width * scale_factor,
 y=img_height * scale_factor,
 sizey=img_height * scale_factor,
 xref="x",
 yref="y",
 opacity=1.0,
 layer="below",
 sizing="stretch",
 source=f"data:image/png;base64,{encoded_img}")  # 使用Base64字符串
)

验证修改后的完整Dash代码

这里给你一个完整的可运行示例(以方法1为例):

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

app = dash.Dash(__name__)

fig = go.Figure()
# Constants
img_width = 600
img_height = 400
scale_factor = 0.5
# Add invisible scatter trace.
fig.add_trace(
 go.Scatter(
 x=[0, img_width * scale_factor],
 y=[0, img_height * scale_factor],
 mode="markers",
 marker_opacity=0
 )
)
# Configure axes
fig.update_xaxes(
 visible=False,
 range=[0, img_width * scale_factor]
)
fig.update_yaxes(
 visible=False,
 range=[0, img_height * scale_factor],
 scaleanchor="x"
)
# Add image(已修改路径)
fig.add_layout_image(
 go.layout.Image(
 x=0,
 sizex=img_width * scale_factor,
 y=img_height * scale_factor,
 sizey=img_height * scale_factor,
 xref="x",
 yref="y",
 opacity=1.0,
 layer="below",
 sizing="stretch",
 source="/assets/logo.png")
)
# Configure other layout
fig.update_layout(
 width=img_width * scale_factor,
 height=img_height * scale_factor,
 margin={"l": 0, "r": 0, "t": 0, "b": 0},
)

app.layout = html.Div(style={'backgroundColor': 'white'}, children=[
 html.Div(html.H1(children="My Dashboard ")),
 dcc.Graph(figure=fig),
])

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

只要按方法1把图片放到assets目录,或者用方法2转Base64,重新运行Dash应用,浏览器里就能正常显示图片了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:17:37