在 pygame 中使用 matplotlib

Dee*_*gen 8 python pygame matplotlib python-3.x

我在这里有一个很大的问题——我想大多数人都不会喜欢这个问题,而且我可能会因为自己是菜鸟而受到批评,但无论如何,我还是要问这个问题。

我正在尝试使用 matplotlib 在我的 pygame 程序中实现条形图。我设法非常简单地做到这一点,但没有使用 pygame。

我已经成功制作了一个条形图,但无法将其放入 pygame 中:

names = ['a', 'b', 'c']
values = [1, 10, 100]
plt.figure(1, figsize=(9, 3))
plt.bar(names, values)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我想在 pygame 中将其实现到我的游戏中,但老实说我不知道​​从哪里开始。这是下周到期的一个项目。谢谢。

fur*_*ras 6

matplotlib默认用于tkinter显示图表。它也可以使用PyQtor wxPython- 它们被称为"backends"- 但它没有用作PyGame后端的方法。

我发现的唯一内容(使用 Google)是PyGame wiki 中的示例

它将 matplotlib 图形渲染为位图,然后将此位图转换为可用于创建Surface图像的字符串。

import matplotlib
matplotlib.use("Agg")

import matplotlib.backends.backend_agg as agg


import pylab

fig = pylab.figure(figsize=[4, 4], # Inches
                   dpi=100,        # 100 dots per inch, so the resulting buffer is 400x400 pixels
                   )
ax = fig.gca()
ax.plot([1, 2, 4])

canvas = agg.FigureCanvasAgg(fig)
canvas.draw()
renderer = canvas.get_renderer()
raw_data = renderer.tostring_rgb()

import pygame
from pygame.locals import *

pygame.init()

window = pygame.display.set_mode((600, 400), DOUBLEBUF)
screen = pygame.display.get_surface()

size = canvas.get_width_height()

surf = pygame.image.fromstring(raw_data, size, "RGB")
screen.blit(surf, (0,0))
pygame.display.flip()

crashed = False
while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Fankly 我不会使用 matplotlib 来创建图形 - 特别是它不是交互式的。在 PyGame 中创建自己的图表可能很容易。

  • 我知道这已经过时了,但我会添加我认为重要的区别:Pygame 尚不具备良好的抗锯齿绘图功能。这使得线条和其他形状看起来确实参差不齐,并且通常不如 matplotlib 生成的那么干净。我正在处理类似的应用程序需求。使用 pygame 编码后,我决定研究使用 matplotlib 渲染到缓冲区并通过 pygame 显示图形。据我所知,用这种方式产生的线条和其他形状的平滑度是 pygame 无法比拟的。顺便说一句,我用它来模拟,而不是游戏。 (5认同)