Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pygame中使用matplotlib_Python_Python 3.x_Matplotlib_Pygame - Fatal编程技术网

Python 在pygame中使用matplotlib

Python 在pygame中使用matplotlib,python,python-3.x,matplotlib,pygame,Python,Python 3.x,Matplotlib,Pygame,我这里有一个大问题——我想大多数人都不会喜欢这个问题,我可能会因为成为一个傻瓜而被炒鱿鱼,但不管怎样,问题还是来了 我正在尝试使用matplotlib在pygame程序中实现一个条形图。我很简单地做到了这一点,但没有使用pygame 我已成功制作了一个条形图,但无法将其放入pygame: names = ['a', 'b', 'c'] values = [1, 10, 100] plt.figure(1, figsize=(9, 3)) plt.bar(names, values) plt.sh

我这里有一个大问题——我想大多数人都不会喜欢这个问题,我可能会因为成为一个傻瓜而被炒鱿鱼,但不管怎样,问题还是来了

我正在尝试使用matplotlib在pygame程序中实现一个条形图。我很简单地做到了这一点,但没有使用pygame

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

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

我想在pygame中实现这一点,但我真的不知道从哪里开始。这是一个下周到期的项目。谢谢。

matplotlib
默认使用
tkinter
显示图形。它还可以使用
PyQt
wxPython
——它们被称为
“后端”
——但它没有将
PyGame
用作后端的方法

我(使用谷歌)发现的唯一问题是

它将matplotlib图形渲染为位图,然后将此位图转换为字符串,该字符串可用于创建带有图像的
曲面

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


我当然不会使用matplotlib来创建图形,尤其是它不是交互式的。在PyGame中创建自己的图形可能很容易。

我今天花了一整天的时间试图扩展@furas的答案,以摆脱那该死的白色背景。为了子孙后代,我要把这个放在这里。使用他的答案,但替换这两行以使用alpha分量,因此背景是透明的:

raw_data = renderer.buffer_rgba ()
surf     = pygame.image.frombuffer (raw_data, size, "RGBA")
我还调整了图中的一些设置:

dims = pygame2matplotlib (w, h)
fig  = plt.figure (**dims, facecolor='none', edgecolor='none')
fig.patch.set_visible (False)

公认的答案没有解释如何设置线条颜色、线条样式等。这就是我的发现,希望对其他人有用

您需要一个工作的
python-tk
,并使用pip安装
pygame
matplotlib
。以下代码在Ubuntu 18.04上用python3、pygame 2.0.1和matplotlib 3.3.4进行了测试

有关如何自定义代码的一些链接:

  • 解释
  • 解释
  • 定制

导入matplotlib
将matplotlib.pyplot作为plt导入
将matplotlib.backends.backend_agg作为agg导入
导入pygame
从pygame.locals导入*
进口派拉布
matplotlib.use(“Agg”)
plt.rcParams.update({
“lines.marker”:“o”,“可用('o','v','^','8','s','p','*','h','h','D','D','p','X'))
“线条.线宽”:“1.8”,
“轴属性循环”:plt.cycler('color',['white']),#线颜色
“text.color”:“白色”,本例中无文本
“axes.facecolor”:“黑色”#图形背景
“axes.edgecolor”:“浅灰色”,
“axes.labelcolor”:“白色”,本例中没有标签
“axes.grid”:“True”,
“grid.linestyle:”--“,#{'-','-','-.,':','',''(偏移,开-关顺序),…}
“xtick.color”:“白色”,
“ytick.color”:“白色”,
“网格颜色”:“浅灰色”,
“figure.facecolor”:“黑色”,即围绕绘图的颜色
“figure.edgecolor”:“黑色”,
})
fig=pylab.图(figsize=[4,2],#英寸
dpi=100)#每英寸100点,因此产生的缓冲区为400x200像素
图.patch.set_alpha(0.1)#使绘图周围90%透明以显示其功能
ax=图gca()
ax.绘图([1,2,4])
画布=聚集图Canvasagg(图)
canvas.draw()
renderer=canvas.get_renderer()
raw_data=renderer.buffer_rgba()
pygame.init()
window=pygame.display.set_模式((600210),DOUBLEBUF)
screen=pygame.display.get_surface()
大小=画布。获取宽度和高度()
surf=pygame.image.frombuffer(原始数据,大小,“RGBA”)
背景颜色=(255,0,0)#填充红色作为背景色
屏幕填充(背景颜色)
屏幕。blit(冲浪,(100,5))#屏幕上的x,y位置
pygame.display.flip()
停止=错误
虽然没有停止:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
停止=正确
pygame.time.Clock().tick(30)#避免100%的CPU使用

您将如何在pygame中创建自己的图形?谢谢你的快速回复-我在谷歌上也找到了这个,但老实说,我不明白它是如何工作的。感谢您的解释。您可以使用
pygame.draw.rect()
绘制条形图
PyGame
还有其他方法来绘制对象和文本。你必须单独绘制每个元素,但你有控制权,它可以是动画或交互的。例如,请参阅PyGame的未来GUI-有动画条-代码。我知道这很旧,但我要补充一点,我认为这是一个重要的区别:PyGame还没有很好的抗锯齿绘制功能。这使得线条和其他形状看起来非常参差不齐,通常不像matplotlib生成的那样干净。我正在处理一个类似的申请需要。在使用pygame编码之后,我决定研究使用matplotlib渲染到缓冲区并通过pygame显示图形。据我所知,以这种方式产生的线条和其他形状的平滑度是pygame无法比拟的。顺便说一句,我用它来模拟,而不是游戏。你从哪里获取
pygame2matplotlib
plt
?你能把你的完整密码贴出来吗?作为pygame和matplotlib的新手,我在编译您的添加内容时遇到问题。