I used an example for myself.I'm able to add scroll and slider.
The slider reacts to its impact. Cannot zoom in and then scroll the graph along the axis. There is a good example of how to do this in the chart " matplotlib"
But, I want to do everything in pyqt5. I cannot find a similar function "set_x lim" in pyqt5.
Ideally I want to get a graph with the ability to zoom, scroll.
Here is the main part of the code that managed to do:
ui = QMainWindow()
central_widget = QWidget()
vbox=QtWidgets.QVBoxLayout(central_widget)
Scroll = QScrollBar(Qt.Horizontal, central_widget)
Slider = QSlider(Qt.Horizontal, central_widget)
Slider.setRange(1, 100)
chartview = QChartView(chart, central_widget)
vbox.addWidget(chartview)
vbox.addWidget(Slider)
vbox.addWidget(Scroll)
def scale():
step=Slider.value()/100
print(step)
update()
def update(evt=None):
r = Scroll.value() / ((1 + step) * 100)
#????????????????????
print(r)
Slider.actionTriggered.connect(scale)
Scroll.actionTriggered.connect(update)
ui.setGeometry(70, 70, 400, 300)
ui.setCentralWidget(central_widget)
ui.show()
sys.exit(app.exec_())
This is how I did in pyqt5+matplotlib, based on the example:
class ScrollableWindow(QtWidgets.QMainWindow):
def __init__(self, fig, ax, step=0.1):
plt.close("all")
self.qapp = QtWidgets.QApplication([])
QtWidgets.QMainWindow.__init__(self)
self.widget = QtWidgets.QWidget()
self.setCentralWidget(self.widget)
self.vbox=QtWidgets.QVBoxLayout(self.widget)
self.gbox = QtWidgets.QHBoxLayout(self.widget)
self.vkl = 1
self.ln=0
self.ln1 = 0
self.step = step
self.fig = fig
self.ax = ax
self.canvas = FigureCanvas(self.fig)
self.canvas.draw()
self.scroll = QtWidgets.QScrollBar(QtCore.Qt.Horizontal)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(1, 100)
self.setupSlider()
self.nav = NavigationToolbar(self.canvas, self.widget)
self.vbox.addWidget(self.canvas)
self.vbox.addWidget(self.scroll)
self.gbox.addWidget(self.slider)
self.gbox.addWidget(self.nav)
self.gbox.addStretch(1)
self.vbox.addLayout(self.gbox)
self.setLayout(self.vbox)
self.canvas.draw()
self.show()
self.qapp.exec_()
def scale(self):
self.step = self.slider.sliderPosition()/100.0
self.update()
def setupSlider(self):
self.lims = np.array(self.ax.get_xlim())
self.scroll.setPageStep(self.step * 100)#ax.get_xlim()
self.scroll.actionTriggered.connect(self.update)
self.slider.actionTriggered.connect(self.scale)
self.update()
def update(self, evt=None):
r = self.scroll.value() / ((1 + self.step) * 100)
l1 = self.lims[0] + r * np.diff(self.lims)
l2 = l1 + np.diff(self.lims) * self.step
self.ax.set_xlim(l1, l2) # Show only this section of the x-axis coordinate
if l1>0 and l2>0 and l2<(len(z)-1): # auto height chart
xmin = np.amin(z[int(l1):int(l2)])
xmax = np.amax(z[int(l1):int(l2)])
self.ax.set_ylim([xmin, xmax])
self.fig.canvas.draw_idle()
x = pd.read_csv('file.txt',
index_col='DATE',
parse_dates=True,
infer_datetime_format=True)
z = x.iloc[:, 3].values
N = len(z)
ind = np.arange(N)
fig, ax = plt.subplots()
ax.plot(ind, z)
a = ScrollableWindow(fig,ax)