python - 如何在 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()
解决方案
您必须使用以下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)
推荐阅读
- android - 编写与 IOS 和 Android 兼容的包以支持 BLE
- javascript - 有人可以解释一下这个回文解决方案吗?
- typescript - 导航到其他选项卡时无法破坏淘汰赛绑定(MetroJS)
- r - coord_flip 后分组条形图中数据的翻转顺序
- android - 清单合并失败:Android Studio 多个错误
- c# - ShowDialog 在 Windows Server 2016 上花费了太多时间
- javascript - 链接重定向到另一个页面和特定选项卡
- oracle - INITIAL_VALUE 上的 SET_ITEM_PROPERTY 不起作用
- git - Azure DevOps 默认权限
- bitwise-xor - 如何在按位异或中反转我的公式以获得 53 的值?