首页 > 解决方案 > 如何在 Pyglet 窗口中嵌入 Matplotlib 图

问题描述

我刚刚开始使用 pyglet,我正在尝试为使用gym 的强化学习应用程序开发视觉渲染。

我需要将使用 matplolib 或其他东西生成的图形集成到我的窗口中。我找到了一些可以满足我要求的示例代码,但它似乎从 python 3 开始就不起作用了。

我在第 15 行声明并在第 16 行使用的 io 的 StringIO 类似乎存在问题。但我不确定它到底是什么。

import pyglet
import io
import numpy as np

from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg


def render_figure(fig):
    w, h = fig.get_size_inches()
    dpi_res = fig.get_dpi()
    w, h = int(np.ceil(w * dpi_res)), int(np.ceil(h * dpi_res))

    canvas = FigureCanvasAgg(fig)
    pic_data = io.StringIO()
    canvas.print_raw(pic_data, dpi=dpi_res)
    return pyglet.image.ImageData(w, h, "RGBA", pic_data.getvalue(), -4 * w)


def draw_figure(fig):
    X = np.linspace(-6, 6, 1024)
    Y = np.sinc(X)

    ax = fig.add_subplot(111)
    ax.plot(X, Y, lw=2, color="k")


window = pyglet.window.Window(fullscreen=True)
dpi_res = min(window.width, window.height) / 10
fig = Figure((window.width / dpi_res, window.height / dpi_res), dpi=dpi_res)

draw_figure(fig)
image = render_figure(fig)


@window.event
def on_draw():
    window.clear()
    image.blit(0, 0)


pyglet.app.run()

标签: pythonmatplotlibpyglet

解决方案


您必须使用以下FigureCanvasAgg.print_to_buffer()方法:

def render_figure(fig):
    canvas = FigureCanvasAgg(fig)
    data, (w, h) = canvas.print_to_buffer()
    return pyglet.image.ImageData(w, h, "RGBA", data, -4 * w)

推荐阅读