Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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 如何在matplotlib中设置背景以高效重画?_Python_Performance_Matplotlib - Fatal编程技术网

Python 如何在matplotlib中设置背景以高效重画?

Python 如何在matplotlib中设置背景以高效重画?,python,performance,matplotlib,Python,Performance,Matplotlib,我使用Matplotlib允许用户查找和调整图形的上下封套,以便将其规格化为[0,1]间隔。我明白了,但不幸的是,我还没有找到解决办法 规则: “d”键删除光标处的一个点(如果附近有任何点) “i”键在光标处插入一个点 鼠标拖动移动点 关闭图形会记录信封的当前状态,因此它有点像OK按钮 我想使用self.fig.canvas.restore\u region(self.background)而不是self.fig.canvas.draw()进行更有效的重画。问题是,当我拖动一个点时,原始直线

我使用Matplotlib允许用户查找和调整图形的上下封套,以便将其规格化为[0,1]间隔。我明白了,但不幸的是,我还没有找到解决办法

规则:

  • “d”键删除光标处的一个点(如果附近有任何点)
  • “i”键在光标处插入一个点
  • 鼠标拖动移动点
  • 关闭图形会记录信封的当前状态,因此它有点像OK按钮
我想使用
self.fig.canvas.restore\u region(self.background)
而不是
self.fig.canvas.draw()
进行更有效的重画。问题是,当我拖动一个点时,原始直线和点也会保留在绘图上,因为它被解释为图形的一部分
self.background
。我只希望
self.basedata
作为背景,并动态更改
self.line
self.peakplot
。当前,当我移动数据点时,线和点将加倍

在前面提到的SO中使用
safe\u draw
函数,因此当我调整matplotlib窗口的大小时,答案不起作用 (这在使用真实数据集时是必需的。)

代码如下:

从matplotlib导入pyplot作为plt
将numpy作为np导入
def calc_包络线(x,ind,mode='u'):
'''https://stackoverflow.com/a/39662343/11751294'''
x_abs=np.abs(x)
如果模式==“u”:
loc=np.where(np.diff(np.sign(np.diff(x_abs)))<0[0]+1
elif模式=='l':
loc=np.where(np.diff(np.sign)(np.diff(x_abs))>0)[0]+1
其他:
raise VALUE ERROR('模式必须为u或l.)
峰值=x_绝对值[loc]
包络线=np.INTP(ind、loc、peak)
返回信封,峰值,loc
类DragableEnvelope:
#这应该是以后的像素距离,因为x和y可以以不同的比例缩放。
epsilon=2#可算作命中的最大绝对距离
定义初始化(self,x,y,mode='l'):
self.fig,self.ax=plt.subplot()
self.x=x
self.y=y
self.mode=mode
如果self.mode==“l”:
self.envelope,self.y_env,loc=calc_envelope(
self.y,np.arange(len(self.y)),'l'
)
plt.title('调整下信封')
elif self.mode==“u”:
self.envelope,self.y_env,loc=calc_envelope(
self.y,np.arange(len(self.y)),'u'
)
plt.title('调整上信封')
其他:
raise VALUE ERROR('模式必须为u或l.)
self._ind=None#活动点索引
self.basedata,=self.ax.plot(self.x,self.y)
self.lines,=self.ax.plot(self.x,self.envelope,'r')
self.x_env=self.x[loc]
self.peakplot,=self.ax.plot(self.x_env,self.y_env,'ko')
self.fig.canvas.mpl\u connect('button\u press\u event',self.button\u press\u callback)
self.fig.canvas.mpl\u connect('key\u press\u事件',self.key\u press\u回调)
self.fig.canvas.mpl\u connect('draw\u事件',self.draw\u回调)
self.fig.canvas.mpl\u connect('button\u release\u event',self.button\u release\u callback)
self.fig.canvas.mpl\u connect('motion\u notify\u event',self.motion\u notify\u回调)
plt.grid()
plt.show()
def按钮释放回调(自身、事件):
''只要释放鼠标按钮''
如果event.button!=1:
返回
self.\u ind=无
def get_ind_下_点(自身、事件):
''获取给定ε公差范围内选定点的索引''
d=np.hypot(self.x_env-event.xdata,self.y_env-event.ydata)
indseq,=np.nonzero(d==d.min())
ind=indseq[0]
如果d[ind]>=self.epsilon:
ind=无
返回ind
def按钮按下回调(自身,事件):
''只要按下鼠标按钮,我们就会得到索引''
如果event.inaxes为无:
返回
如果event.button!=1:
返回
self.\u ind=self.get\u ind\u在\u点下(事件)
def按钮释放回调(自身、事件):
''只要释放鼠标按钮''
如果event.button!=1:
返回
self.\u ind=无
def key_press_回调(自,事件):
''只要按下一个键''
如果不是event.inaxes:
返回
如果event.key='d':
ind=self.get\u ind\u在\u点下(事件)
如果ind不是无:
self.x_env=np.delete(self.x_env,
(印度)
self.y_env=np.delete(self.y_env,ind)
self.interpolate()
self.peakplot.set_数据(self.x_env、self.y_env)
self.lines.set_数据(self.x、self.envelope)
elif event.key==“i”:
self.y_env=np.append(self.y_env,event.ydata)
self.x_env=np.append(self.x_env,event.xdata)
self.interpolate()
self.peakplot.set_数据(self.x_env、self.y_env)
self.lines.set_数据(self.x、self.envelope)
如果self.peakplot.stale:
self.fig.canvas.draw_idle()
def get_数据(自身):
如果self.mode==“l”:
返回self.y-self.信封
elif self.mode==“u”:
返回self.y/self.信封
def draw_回调(自身、事件):
self.background=self.fig.canvas.copy_from_bbox(self.ax.bbox)
self.ax.draw_艺术家(self.peakplot)
self.ax.draw_艺术家(self.lines)
def motion_notify_回调(自身、事件):
''鼠标移动时,我们移动选定点''
如果self.\u ind为无:
返回
如果event.inaxes为无:
返回
如果event.button!=1:
返回
x、 y=event.xdata,event.ydata
self.x_env[self.\u ind],self.y_env[self.\u ind]=x,y
self.interpolate()
自己