matplotlib आकृति ज़ूम: टिकलबेल अपडेट नहीं होते हैं (पायथन) - पायथन, पायथन-3.x, matplotlib, साजिश, pyqt

I design a software in Python to make live plots माइक्रोकंट्रोलर डेटा से। आप इसे किसी प्रकार के आस्टसीलस्कप के रूप में सोच सकते हैं। मैं भूखंडों को खींचने के लिए मैटलपोटलिब लाइब्रेरी का उपयोग करता हूं, जिसे मैं एक PyQt4 GUI में एम्बेड करता हूं। मैंने अमल किया zoomआकृति पर ज़ूम करने के लिए बटन (ज़ूम का केवल y सीमाओं पर प्रभाव पड़ता है):

यहां छवि विवरण दर्ज करें

दुर्भाग्य से yticklabels डॉन "अपडेट नहीं हुआ। मैंने कई चीजों की कोशिश की है (जैसे कॉल करना repaint() उचित QWidget पर कार्य करें), लेकिन कोई फायदा नहीं हुआ।इसलिए मैंने आपकी मदद के लिए स्टैकऑवरफ्लो की ओर रुख करने का फैसला किया। नीचे आपको एक कोड सैंपल मिल सकता है जो समस्या का समाधान करता है। डेटा सिम्युलेटेड है, इसलिए आपको "माइक्रोकंट्रोलर कनेक्ट करने की आवश्यकता नहीं है। आम तौर पर आपको इस नमूने को कॉपी / पेस्ट करने में सक्षम होना चाहिए, और इसे बिना मुद्दों के चलाना चाहिए। कुछ समय पर क्लिक करें।" 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_())

""""""

नोट: मेरा सिस्टम कॉन्फ़िगरेशन निम्नानुसार है:

  • विंडोज 10
  • एनाकोंडा पायथन पैकेज स्थापित
  • GUI के लिए PyQt4 लाइब्रेरी
  • matplotlib library for the plots

आपकी मदद के लिए बहुत बहुत धन्यवाद।

उत्तर:

जवाब के लिए 3 № 1

मुझे विश्वास है कि मुझे जवाब मिल गया। zoomIn में कार्य CustomFigCanvas() कक्षा में निर्देश होना चाहिए:

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 """

असुविधा के लिए मुझे खेद है।


संबंधित सवाल
सबसे लोकप्रिय