Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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
matplotlib图形缩放:滴答滴答滴答;无法更新(Python)_Python_Python 3.x_Matplotlib_Plot_Pyqt - Fatal编程技术网

matplotlib图形缩放:滴答滴答滴答;无法更新(Python)

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求助。在下面,您可以找到一个代码示例来挑出问题。数据是模拟的,因此不需要连接微控制器。通常,您应该能够复制/

我用Python设计了一个软件,从微控制器数据生成实时绘图。你可以把它想象成某种示波器。我使用matplotlib库绘制绘图,并将其嵌入到PyQt4 GUI中。我实现了一个
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()#