如何在Pyglet窗口中嵌入Matplotlib图表

3

我刚开始使用 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()
1个回答

3

你需要使用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)

太棒了,它起作用了,谢谢。 - Philippe Maisonneuve
@PhilippeMaisonneuve 请查看[导览]并进行审核。 - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接