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

Docker容器化Python项目:Matplotlib/Plotly图形无法显示求助

容器化Matplotlib/Plotly项目图形无法显示的解决方案

容器默认是无GUI的隔离环境,Matplotlib的plt.show()依赖桌面GUI后端,Plotly的fig.show()需要本地浏览器支持,这是图形无法显示的核心原因。以下是两种可行的解决思路:


方案1:导出图形/表格为文件(推荐,无需GUI环境)

适合不需要实时交互、仅需输出结果的场景,将图形和表格保存为文件后,从容器复制到宿主机查看。

修改Python代码

替换plt.show()和fig.show()为文件导出逻辑,同时可选配置Matplotlib非交互式后端避免警告:

# 可选:配置Matplotlib使用非交互式后端
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import plotly.graph_objects as go

def display_num_occurences(interesting_words: dict) -> None:
    """
    生成词频柱状图并保存为图片
    """
    words = list(interesting_words.keys())
    occurrences = [interesting_words[word]['occurences'] for word in words]

    plt.figure(figsize=(10, 5))
    plt.bar(words, occurrences, color='blue')
    plt.title('Occurrences of Words')
    plt.xlabel('Words')
    plt.ylabel('Occurrences')
    plt.grid(axis='y')
    plt.xticks(rotation=45)
    plt.yticks(range(0, max(occurrences) + 1, 1))
    # 替换plt.show()为保存图片
    plt.savefig('word_occurrences.png', bbox_inches='tight')
    plt.close()  # 关闭画布释放资源

def display_table(interesting_words: dict) -> None:
    """
    生成词频表格并保存为HTML文件
    """
    table_data = [['Word', 'Occurrences', 'Documents', 'Sentences']]
    table_data.append(list(interesting_words.keys()))
    table_data.append([interesting_words[word]['occurences'] for word in interesting_words.keys()])
    table_data.append(['\n'.join(interesting_words[word]['documents']) for word in interesting_words.keys()])
    table_data.append(['\n'.join(interesting_words[word]['sentences']) for word in interesting_words.keys()])
    
    fig = go.Figure(data=[go.Table(
        header=dict(values=table_data[0], fill_color='lightblue', align='center'),
        cells=dict(values=table_data[1:], fill_color='white', align='left'))
    ])

    fig.update_layout(title="Table of Word Occurrences", width=2000, height=1000)
    # 替换fig.show()为保存HTML文件
    fig.write_html('word_table.html')

精简Dockerfile(可选)

去掉不必要的GUI依赖,使用轻量Python镜像:

FROM python:3.9-slim

WORKDIR /app

COPY . /app

RUN pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt

CMD ["python3", "app.py"]

查看结果

容器运行完成后,将生成的文件复制到宿主机:

# 复制图片
docker cp <容器ID>:/app/word_occurrences.png .
# 复制HTML表格
docker cp <容器ID>:/app/word_table.html .

在本地直接打开图片或HTML文件即可查看内容。


方案2:通过X11转发在宿主机显示GUI

适合需要实时交互查看图形的场景,需宿主机支持X11(Linux/macOS原生支持,Windows需安装Xming等X11服务器)。

修改Dockerfile

添加X11相关依赖并配置环境变量:

FROM ubuntu:20.04

WORKDIR /app

COPY . /app

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y build-essential python3-pip python3-tk python3-pil python3-pil.imagetk x11-apps && \
    pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt && \
    rm -rf /var/lib/apt/lists/*

# 传递宿主机DISPLAY环境变量,挂载X11套接字
ENV DISPLAY=$DISPLAY
VOLUME /tmp/.X11-unix

CMD ["python3", "app.py"]

运行容器

  • Linux/macOS:先允许本地X11访问,再启动容器
# 允许本地root用户访问X11
xhost +local:root
# 启动容器
docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix <你的镜像名>
  • Windows:先启动Xming服务器,再运行容器(DISPLAY地址设为host.docker.internal:0)
docker run -it --rm -e DISPLAY=host.docker.internal:0 <你的镜像名>

可选代码调整

若需要Matplotlib的交互式功能,可在代码开头指定TkAgg后端:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:02:38