matplotlib图形缩放:滴答滴答滴答;无法更新(Python)
我用Python设计了一个软件,从微控制器数据生成实时绘图。你可以把它想象成某种示波器。我使用matplotlib库绘制绘图,并将其嵌入到PyQt4 GUI中。我实现了一个matplotlib图形缩放:滴答滴答滴答;无法更新(Python),python,python-3.x,matplotlib,plot,pyqt,Python,Python 3.x,Matplotlib,Plot,Pyqt,我用Python设计了一个软件,从微控制器数据生成实时绘图。你可以把它想象成某种示波器。我使用matplotlib库绘制绘图,并将其嵌入到PyQt4 GUI中。我实现了一个zoom按钮来放大图形(缩放仅影响y限制): 不幸的是,yticklabels没有得到更新。我尝试过几种方法(比如在适当的QWidget上调用repaint()函数),但都没有用。所以我决定向StackOverflow求助。在下面,您可以找到一个代码示例来挑出问题。数据是模拟的,因此不需要连接微控制器。通常,您应该能够复制/
zoom
按钮来放大图形(缩放仅影响y限制):
不幸的是,yticklabels
没有得到更新。我尝试过几种方法(比如在适当的QWidget上调用repaint()
函数),但都没有用。所以我决定向StackOverflow求助。在下面,您可以找到一个代码示例来挑出问题。数据是模拟的,因此不需要连接微控制器。通常,您应该能够复制/粘贴此示例,并运行它而不会出现问题。在zoom
按钮上单击几次,您就会注意到我的问题
import sys
import os
from PyQt4 import QtGui
from PyQt4 import QtCore
import functools
import numpy as np
import random as rd
import matplotlib
matplotlib.use("Qt4Agg")
from matplotlib.figure import Figure
from matplotlib.animation import TimedAnimation
from matplotlib.lines import Line2D
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
def setCustomSize(x, width, height):
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(x.sizePolicy().hasHeightForWidth())
x.setSizePolicy(sizePolicy)
x.setMinimumSize(QtCore.QSize(width, height))
x.setMaximumSize(QtCore.QSize(width, height))
''''''
class CustomMainWindow(QtGui.QMainWindow):
def __init__(self):
super(CustomMainWindow, self).__init__()
# Define the geometry of the main window
self.setGeometry(300, 300, 800, 400)
self.setWindowTitle("my first window")
# Create FRAME_A
self.FRAME_A = QtGui.QFrame(self)
self.FRAME_A.setStyleSheet("QWidget { background-color: %s }" % QtGui.QColor(210,210,235,255).name())
self.LAYOUT_A = QtGui.QGridLayout()
self.FRAME_A.setLayout(self.LAYOUT_A)
self.setCentralWidget(self.FRAME_A)
# Place the zoom button
self.zoomBtn = QtGui.QPushButton(text = 'zoom')
setCustomSize(self.zoomBtn, 100, 50)
self.zoomBtn.clicked.connect(self.zoomBtnAction)
self.LAYOUT_A.addWidget(self.zoomBtn, *(0,0))
# Place the matplotlib figure
self.myFig = CustomFigCanvas()
self.LAYOUT_A.addWidget(self.myFig, *(0,1))
self.show()
''''''
def zoomBtnAction(self):
print("zoom in")
self.myFig.zoomIn(5)
''''''
''' End Class '''
class CustomFigCanvas(FigureCanvas, TimedAnimation):
def __init__(self):
self.addedData = []
print(matplotlib.__version__)
# The data
self.xlim = 200
self.n = np.linspace(0, self.xlim - 1, self.xlim)
a = []
b = []
a.append(2.0)
a.append(4.0)
a.append(2.0)
b.append(4.0)
b.append(3.0)
b.append(4.0)
self.y = 50 + ((rd.random()*a[0] + 0.2)*np.sin(self.n/(b[0]*rd.random() + 0.2))) + ((rd.random()*a[1] + 0.1)*np.sin(self.n/(b[1]*rd.random() + 0.2))) + ((rd.random()*a[2] + 0.1)*np.sin(self.n/(b[2]*rd.random() + 0.2)))
# The window
self.fig = Figure(figsize=(5,5), dpi=100)
self.ax1 = self.fig.add_subplot(111)
# self.ax1 settings
self.ax1.set_xlabel('time')
self.ax1.set_ylabel('raw data')
self.line1 = Line2D([], [], color='blue')
self.line1_tail = Line2D([], [], color='red', linewidth=2)
self.line1_head = Line2D([], [], color='red', marker='o', markeredgecolor='r')
self.ax1.add_line(self.line1)
self.ax1.add_line(self.line1_tail)
self.ax1.add_line(self.line1_head)
self.ax1.set_xlim(0, self.xlim - 1)
self.ax1.set_ylim(0, 100)
FigureCanvas.__init__(self, self.fig)
TimedAnimation.__init__(self, self.fig, interval = 50, blit = True)
def _draw_frame(self, framedata):
margin = 2
while(len(self.addedData) > 0):
self.y = np.roll(self.y, -1)
self.y[-1] = self.addedData[0]
del(self.addedData[0])
self.line1.set_data(self.n[ 0 : self.n.size - margin ], self.y[ 0 : self.n.size - margin ])
self.line1_tail.set_data(np.append(self.n[-10:-1 - margin], self.n[-1 - margin]), np.append(self.y[-10:-1 - margin], self.y[-1 - margin]))
self.line1_head.set_data(self.n[-1 - margin], self.y[-1 - margin])
self._drawn_artists = [self.line1, self.line1_tail, self.line1_head]
def new_frame_seq(self):
return iter(range(self.n.size))
def _init_draw(self):
lines = [self.line1, self.line1_tail, self.line1_head]
for l in lines:
l.set_data([], [])
def addData(self, value):
self.addedData.append(value)
def zoomIn(self, value):
bottom = self.ax1.get_ylim()[0]
top = self.ax1.get_ylim()[1]
bottom += value
top -= value
self.ax1.set_ylim(bottom,top)
''' End Class '''
if __name__== '__main__':
app = QtGui.QApplication(sys.argv)
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Plastique'))
myGUI = CustomMainWindow()
sys.exit(app.exec_())
''''''
注:我的系统配置如下:
class CustomFigCanvas(FigureCanvas, TimedAnimation):
def __init__(self):
# ...
''''''
def zoomIn(self, value):
bottom = self.ax1.get_ylim()[0]
top = self.ax1.get_ylim()[1]
bottom += value
top -= value
self.ax1.set_ylim(bottom,top)
self.draw() # <- this is the solution
''''''
''' End Class '''
- 视窗10
- 已安装Anaconda python包
- 用于GUI的PyQt4库
- 用于打印的matplotlib库
非常感谢您的帮助。我相信我找到了答案。
CustomFigCanvas()
类中的zoomIn
函数应包含以下指令:
self.draw()
因此,zoomIn
功能如下:
class CustomFigCanvas(FigureCanvas, TimedAnimation):
def __init__(self):
# ...
''''''
def zoomIn(self, value):
bottom = self.ax1.get_ylim()[0]
top = self.ax1.get_ylim()[1]
bottom += value
top -= value
self.ax1.set_ylim(bottom,top)
self.draw() # <- this is the solution
''''''
''' End Class '''
class CustomFigCanvas(图A、时间信息):
定义初始化(自):
# ...
''''''
def缩放(自身,值):
bottom=self.ax1.get_ylim()[0]
top=self.ax1.get_ylim()[1]
底部+=值
top-=值
self.ax1.set_ylim(底部、顶部)
self.draw()#