我目前正在做一个关于perlin噪声的实验,但生成这种噪声需要使用一系列绘制的标记。比如,一堆,我需要渲染很多图形,渲染20个大约需要15分钟。有没有办法加快我的代码?
import matplotlib.pyplot as plt
import math, random, noise, time
import numpy as np
def GeneratePlot(x:int,y:int) -> list:
pnoiseValues = []
fig, ax = plt.subplots()
for X in range(x**2):
plt.gcf().canvas.flush_events()
marker = str(random.choice(("o", "s")))
YPOS = y+noise.pnoise2(X*x/x**2/50, y/x**2/50)
ax.scatter(X, YPOS, marker=marker)
pnoiseValues.append(YPOS)
plt.show()
return np.array(pnoiseValues)
def GetResults(amount:int, useDelay=True) -> list:
results = []
for i in range(amount):
print(f"Generating Images & Arrays.. (This may take a while depending on the # of points)")
time.sleep(.100 if useDelay else 0)
results.append(GeneratePlot(i**2,i//2**2))
print(results)
return results;
GetResults(16)
所以我还没有尝试过任何东西,因为我是matplotlib 的新手
使用blit可以大大加快绘图速度。在你的例子中,每次你得到一些数据时,你都需要重新绘制图形,然而blit只是在图形中绘制艺术家的某个部分,并使用上次绘制的图形作为背景。我的建议是停止一个新的类,它可以接收用于构造函数的AXES类,每次都添加新的数据并进行replot。下面是我的实时录制应用程序中的一个示例。这是一个非常简单的演示,并且没有更新轴。如果你想在某个时候更新轴,你可以做ax.draw_artist(轴(。在我的i5 8250 cpu中,速度可能有~100fps。一些官方文件https://matplotlib.org/stable/tutorials/advanced/blitting.html
class DisplayRealTime():
def __init__(self, ax:Axes):
self.ax = ax
self.ax.plot(0, 0, animated = True, linewidth = 1)
self.line = ax.lines
self.fig = ax.figure
self.fig.canvas.draw()
self.fig.canvas.flush_events()
self.bg = ax.figure.canvas.copy_from_bbox(ax.figure.bbox)
def append(self, data:np.ndarray):
self.fig.canvas.restore_region(self.bg)
self.line[0].set_data(data)
for i in self.line:
self.ax.draw_artist(i)
self.fig.canvas.blit(self.fig.bbox)
self.fig.canvas.flush_events()nself.bg = self.ax.figure.canvas.copy_from_bbox(self.ax.figure.bbox)