我正在尝试在QGraphicScene上绘制数据,这些数据根据情况可能会因数量级而异。由于我使用的笔是化妆品,所以我希望视图独立于数据的数量级。但是我得到的结果却是这样的:
乘以50000的正弦波加噪声:
乘以50的正弦波加噪声:
然而,如果我放大这些绘图中的任何一个(同样程度的放大),最终达到的级别是两个图像看起来都一样:
这里发生了什么?为什么笔的宽度会因数据值更大而改变?为什么缩放在缩小时消失?
以下是重现此问题的代码。单击绘图将放大,右键单击将缩小。
乘以50000的正弦波加噪声:
![scale 50000](https://i.imgur.com/XHUuUzYm.png)
![scale 50](https://istack.dev59.com/MbNQSm.webp)
![scale 50000 zoom](https://istack.dev59.com/aobEFm.webp)
![enter image description here](https://istack.dev59.com/2u3eRm.webp)
以下是重现此问题的代码。单击绘图将放大,右键单击将缩小。
import sys
from PyQt4 import QtGui as QG
from PyQt4 import QtCore as QC
import numpy as n
class ZoomView(QG.QGraphicsView):
"""Zoomable QGraphicsView"""
def mouseReleaseEvent(self,event):
if event.button() == QC.Qt.LeftButton:
self.scale(1.5,1)
elif event.button() == QC.Qt.RightButton:
self.scale(1/1.5,1)
class MainUI(QG.QDialog):
def __init__(self, parent=None):
super(MainUI, self).__init__(parent)
layout = QG.QVBoxLayout()
self.setLayout(layout)
button_layout = QG.QHBoxLayout()
pb3 = QG.QPushButton('add plot')
button_layout.addWidget(pb3)
layout.addLayout(button_layout)
pb3.clicked.connect(self.scene_maker_singleshot)
scene = QG.QGraphicsScene()
view = ZoomView(self)
view.setTransformationAnchor(QG.QGraphicsView.AnchorUnderMouse)
view.setRenderHint(QG.QPainter.Antialiasing)
layout.addWidget(view)
view.setScene(scene)
self.view = view
self.scene = scene
def scene_maker_singleshot(self):
"""Draw scene and fit in view"""
t1 = 50
t2 = 100
QC.QTimer.singleShot(t1, self.make_scene)
QC.QTimer.singleShot(t2, lambda: self.view.fitInView(self.view.sceneRect()))
def make_scene(self):
scale = 50
#scale = 50000
noise_amp = 0.2*scale
points = 1000
xdata = n.arange(points)
#generate sine data and random noise
ydata = n.sin(xdata/(points/10.))*scale +\
n.random.randint(noise_amp, size=points)
pen = QG.QPen(QG.QColor("red"))
for i in xrange(1, xdata.size):
self.scene.addLine(xdata[i-1], ydata[i-1], xdata[i], ydata[i], pen)
if __name__=="__main__":
app = QG.QApplication(sys.argv)
gui = MainUI()
gui.setFixedSize(500,500)
gui.show()
app.exec_()
pen = QG.QPen(QG.QColor("red"))
之后,可能需要明确指定pen.setCosmetic(True)
。 - Mad Physicist