【发布时间】:2019-08-27 17:21:09
【问题描述】:
我自己使用了example。我可以添加滚动条和滑块。
滑块对其影响做出反应。无法放大然后沿轴滚动图形。 图表“matplotlib”中有一个很好的example 说明如何做到这一点
但是,我想在 pyqt5 中做所有事情。我在 pyqt5 中找不到类似的函数“set_x lim”。
理想情况下,我希望得到一个能够缩放、滚动的图表。
这是代码的主要部分:
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_())
这就是我在 pyqt5+matplotlib 中的做法,基于示例:
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)
【问题讨论】:
-
我理解你关于滚动条的问题,但不是关于缩放的问题,我解释一下:缩放可以应用在一个轴或两个轴上,还有 zoomIn 和 zoomOut,在你的情况下是 zoomIn、zoomOut 或两者都有?
-
我需要放大,只在 x 轴(水平)上缩小。我添加了GIF 动画,因为水平方向有所增加。 pyqt5+matplotlib.
-
您可以提供一个minimal reproducible example,说明您目前拥有的内容以及生成您在 gif 中显示的内容的代码,以将其作为我可能的解决方案的基础
-
我在图表上还有顶部和底部调整到窗口的高度,这样顶部和底部就没有空白距离。我会把它放在主窗口中。这在我什至来自你的例子。
-
如果您需要帮助,请提供我所要求的内容