在 Plotwidget 内滚动/缩放

Posted

技术标签:

【中文标题】在 Plotwidget 内滚动/缩放【英文标题】:Scrolling/Zooming within a Plotwidget 【发布时间】:2021-05-05 05:27:37 【问题描述】:

我正在玩 Plotwidget,但我不知道如何在放大和缩小时从列表中找到最小-最大位置。

假设我有一个包含 1000 个值的列表。当我滚动/缩放时,我只能确定视图框范围,而不是我在列表中的位置。

例子:

在初始化时我在 x[0], x[1000] 在 x[?]、x[?] 处滚动一次

是否有可能找出最小-最大索引(如果我不是直接在索引上,最接近的索引是什么)?我也想知道,是否可以在滚动时更改缩放因子,我可以将视图框填充设置为 0 吗?我才发现你可以用 setXRange(..., padding=0) 来改变它

import sys
from random import randint
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
from PyQt5.QtCore import Qt
import pyqtgraph as pg

class Win(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.graph = pg.PlotWidget()
        self.setCentralWidget(self.graph)   
        self.graph.sigRangeChanged.connect(self.viewboxChanged)

        x = list()
        y = list()
        pos = 0
        for i in range(1000):
            r = randint(0,5)
            y.append(r)
            x.append(pos)
            pos +=r
        self.graph.plot(x, y)

    def viewboxChanged(self, view, range):
        print(range)
        pass


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Win()
    win.show()
    sys.exit( app.exec_() )

【问题讨论】:

【参考方案1】:

您的问题更像是如何解释 range 变量中的值。注意:考虑更改该变量名称,因为它可能会造成混淆,因为有一个 python's built-in-function 这样调用。

您的 range 变量具有以下结构:

[ [x_0, x_1], [y_0, y_1] ]

地点:

x_0x_1 是在 x-axis 中可见的最小值和最大值。 y_0y_1 是在 y-axis 中可见的最小值和最大值。

现在,您需要的是索引,这可以使用 answer 来完成。最后,以上所有内容在您的代码中的实现将如下所示:

class Win(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.graph = pg.PlotWidget()
        self.setCentralWidget(self.graph)   
        self.graph.sigRangeChanged.connect(self.viewboxChanged)
        ## Change the variables from local to an instance attribute
        ## to acces from the other functions
        self.x = list()
        self.y = list()
        pos = 0
        for i in range(1000):
            r = randint(0,5)
            self.y.append(r)
            self.x.append(pos)
            pos +=r
        self.graph.plot(self.x, self.y)

    def viewboxChanged(self, view, range_v):
        ## range_v[0] will return the list: [x_0, x_1]
        x0 = range_v[0][0]
        x1 = range_v[0][1]
        x0_index = min(self.x, key = lambda x: abs(x-x0))
        x1_index = min(self.x, key = lambda x: abs(x-x1))
        print(x0_index, x1_index)
        pass

里面有cmets解释我做的改动。

【讨论】:

以上是关于在 Plotwidget 内滚动/缩放的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView 缩放问题

在 SwiftUI 中,如何通过动态变化的滚动区域来缩放 scrollView 内的内容?

在 RecyclerView 项目内滚动

在 UIScrollview 上缩放图像后,它会滚动到图像区域之外

如何在arcGIS上恢复默认滚动行为?

正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能