我有一个关于从matplotlib更新动态散点图的问题。 我在Python中有以下类
''' PolygonHandler.py - Python source for polygon handling '''
import numpy as np
import matplotlib.pyplot as plt
class PolygonHandler:
# Constructor
def __init__(self):
self.X = []
self.Y = []
self.numberPoints = 0
# Print the polygon
def draw(self):
plt.scatter(self.X,self.Y)
plt.draw()
def update(self):
for i in range(1,self.numberPoints):
self.X[i] += np.random.normal()*0.01
self.Y[i] += np.random.normal()*0.01
# append a point
def add(self,x,y):
self.numberPoints += 1
self.X.append(x)
self.Y.append(y)
此类用于实时循环,该循环接收信息并将点添加到PolygonHandler类。现在出于示例的目的,我想设计以下循环
P = PolygonHandler()
P.add(1,1)
P.add(2,2)
P.add(1,2)
plt.ion()
plt.show()
while (True):
P.draw()
P.update()
如何告诉翻译人员绘制散点图,并在更新后删除以前的点?现在,我的情节绘制了积分和以前的所有位置。
文森特
非常感谢你的帮助
PS:我遇到的另一个问题是matplotlib打开的窗口冻结并在我点击它时立即停止回答(例如将其移动到我屏幕上的另一个地方),有没有办法防止那个?
答案 0 :(得分:1)
这里有一种方法,使用matplotlib中的动画。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
class PolygonHandler:
# Constructor
def __init__(self):
self.X = []
self.Y = []
self.numberPoints = 0
self.fig , ax = plt.subplots()
self.sc = ax.scatter(self.X,self.Y)
ax.set_xlim(0,3)
ax.set_ylim(0,3)
# Print the polygon
def update(self,_):
for i in range(self.numberPoints):
self.X[i] += np.random.normal()*0.01
self.Y[i] += np.random.normal()*0.01
self.sc.set_offsets(np.column_stack((self.X,self.Y)))
return self.sc,
# append a point
def add(self,x,y):
self.numberPoints += 1
self.X.append(x)
self.Y.append(y)
通过这种方式,您可以绘制3个随机游走:
P = PolygonHandler()
P.add(1,1)
P.add(2,2)
P.add(1,2)
ani = animation.FuncAnimation(P.fig, P.update, interval=10,blit=False)
关键元素是方法set_offsets()
,它替代散点图的数据。然后update()
返回这样的分散对象,以便matplotlib知道它必须更新。对于具有由类处理的matplotlib动画的其他源,请参阅this matplotlib示例。
在最后一行使用blit = True时动画更快,但根据您的操作系统,它可能无效。
答案 1 :(得分:0)
您可以这样做。它接受x,y作为列表,并在同一图上输出散点图和线性趋势。
from IPython.display import clear_output
from matplotlib import pyplot as plt
%matplotlib inline
def live_plot(x, y, figsize=(7,5), title=''):
clear_output(wait=True)
plt.figure(figsize=figsize)
plt.xlim(0, training_steps)
plt.ylim(0, 100)
x= [float(i) for i in x]
y= [float(i) for i in y]
if len(x) > 1:
plt.scatter(x,y, label='axis y', color='k')
m, b = np.polyfit(x, y, 1)
plt.plot(x, [x * m for x in x] + b)
plt.title(title)
plt.grid(True)
plt.xlabel('axis x')
plt.ylabel('axis y')
plt.show();