Helpex - Trao đổi & giúp đỡ Đăng nhập
4

Tôi có một câu hỏi lớn ở đây - một câu hỏi mà tôi tưởng tượng rằng đa số mọi người sẽ không thích và tôi có thể sẽ bị kích động vì trở thành một noob nhưng dù sao thì đây cũng là vấn đề.

Tôi đang cố gắng sử dụng matplotlib để triển khai một barchart vào chương trình pygame của mình. Tôi đã quản lý để làm điều đó khá đơn giản nhưng không sử dụng pygame.

Tôi đã quản lý để tạo một biểu đồ thanh nhưng tôi không thể đưa nó vào pygame:

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

Tôi muốn triển khai điều này cho trò chơi của mình trong pygame nhưng thực sự tôi không biết bắt đầu từ đâu. Nó là cho một dự án sẽ đến hạn vào tuần tới. Cảm ơn.

4 hữu ích 0 bình luận 6.4k xem chia sẻ
4

matplotlibnhư sử dụng mặc định tkinterđể hiển thị đồ thị. Nó cũng có thể sử dụng PyQthoặc wxPython- chúng được gọi "backends"- nhưng nó không có các phương thức để sử dụng PyGamelàm phụ trợ.

Điều duy nhất tôi tìm thấy (sử dụng Google) là ví dụ trong PyGame wiki

Nó kết xuất đồ thị matplotlib thành bitmap và sau đó chuyển bitmap này thành chuỗi có thể được sử dụng để tạo Surfacevới hình ảnh.

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

Sử dụng matplotlib trong pygame

Tôi sẽ không sử dụng matplotlib để tạo biểu đồ - đặc biệt là nó không tương tác. Có thể dễ dàng tạo đồ thị riêng trong PyGame.

4 hữu ích 5 bình luận chia sẻ
0

Tôi đã dành cả ngày hôm nay để cố gắng mở rộng câu trả lời của @ furas, để loại bỏ nền trắng bị thổi phồng đó. Tôi sẽ đặt điều này ở đây vì lợi ích của hậu thế. Sử dụng câu trả lời của anh ấy, nhưng thay thế hai dòng này để sử dụng thành phần alpha, để nền trong suốt:

raw_data = renderer.buffer_rgba ()
surf     = pygame.image.frombuffer (raw_data, size, "RGBA")

Tôi cũng đã điều chỉnh một số cài đặt với hình:

dims = pygame2matplotlib (w, h)
fig  = plt.figure (**dims, facecolor='none', edgecolor='none')
fig.patch.set_visible (False)
0 hữu ích 1 bình luận chia sẻ
0

Câu trả lời được chấp nhận không giải thích cách đặt màu đường kẻ, kiểu đường kẻ và một số cách khác. Vì vậy, đây là những gì tôi tìm thấy và hy vọng nó sẽ hữu ích cho một số người khác.

Bạn sẽ cần một bản làm việc python-tkvà cài đặt pygamematplotlibvới pip. Đoạn mã sau đã được thử nghiệm với python3, pygame 2.0.1 và matplotlib 3.3.4 trên Ubuntu 18.04.

Một số liên kết về cách tùy chỉnh mã:

Sử dụng matplotlib trong pygame

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.backends.backend_agg as agg
import pygame
from pygame.locals import *
import pylab

matplotlib.use("Agg")

plt.rcParams.update({
    "lines.marker": "o",         # available ('o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X')
    "lines.linewidth": "1.8",
    "axes.prop_cycle": plt.cycler('color', ['white']),  # line color
    "text.color": "white",       # no text in this example
    "axes.facecolor": "black",   # background of the figure
    "axes.edgecolor": "lightgray",
    "axes.labelcolor": "white",  # no labels in this example
    "axes.grid": "True",
    "grid.linestyle": "--",      # {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}
    "xtick.color": "white",
    "ytick.color": "white",
    "grid.color": "lightgray",
    "figure.facecolor": "black", # color surrounding the plot
    "figure.edgecolor": "black",
})

fig = pylab.figure(figsize=[4, 2], # Inches
                   dpi=100)        # 100 dots per inch, so the resulting buffer is 400x200 pixels
fig.patch.set_alpha(0.1)           # make the surrounding of the plot 90% transparent to show what it does

ax = fig.gca()
ax.plot([1, 2, 4])

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

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

size = canvas.get_width_height()
surf = pygame.image.frombuffer (raw_data, size, "RGBA")

bg_color = (255, 0, 0)   # fill red as background color
screen.fill(bg_color)
screen.blit(surf, (100, 5)) # x, y position on screen
pygame.display.flip()

stop = False
while not stop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            stop = True
    pygame.time.Clock().tick(30)  # Avoid 100% CPU usage
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x matplotlib pygame , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading