在 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_0
和 x_1
是在 x-axis
中可见的最小值和最大值。
y_0
和 y_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 内滚动/缩放的主要内容,如果未能解决你的问题,请参考以下文章
在 SwiftUI 中,如何通过动态变化的滚动区域来缩放 scrollView 内的内容?