Некорректное отображение графика в оконном режиме

Рейтинг: -1Ответов: 1Опубликовано: 01.04.2023

Есть график, построенный с помощью PlotWidget. На график были добавлена возможность отслеживания мышки и отображение координат: График с примером отображения координат

Однако, если приложение используется в малом окне (не на весь экран), то график начинает уменьшаться на несколько порядков.

Код графика следующий:

    self.plotx = range(181)
    self.ploty = [number**2 for number in self.plotx]

    styles = {'color': 'r', 'font-size': '12px'}
    pen = QtGui.QPen(QtCore.Qt.black, 0.05, QtCore.Qt.SolidLine)
    self.ui.graphicsView.scene().sigMouseMoved.connect(self.mouseMoved)
    self.vLine = InfiniteLine(angle=90, movable=False)
    self.hLine = InfiniteLine(angle=0, movable=False)
    self.cursorlabel = TextItem(anchor=(-1, 10))
    #pen2 = QtGui.QPen(QtCore.Qt.red, 0.1, QtCore.Qt.SolidLine)
    self.ui.graphicsView.setLabel('left', 'Intencivity (Angstrom)', **styles)
    self.ui.graphicsView.setLabel('bottom', 'Angle (2*Theta)', **styles)
    self.ui.graphicsView.addItem(self.vLine, ignoreBounds=True)
    self.ui.graphicsView.addItem(self.hLine, ignoreBounds=True)
    self.ui.graphicsView.addItem(self.cursorlabel)
    self.ui.graphicsView.plot(x, arr, pen=pen)

    def mouseMoved(self, evt):
        pos = evt
        if self.ui.graphicsView.sceneBoundingRect().contains(pos):
            mousePoint = self.ui.graphicsView.plotItem.vb.mapSceneToView(pos)
            mx = np.array([abs(i - mousePoint.x()) for i in self.plotx])
            index = mx.argmin()
            index = int(mousePoint.x())
            if index > 0 and index < len(self.plotx):
                self.cursorlabel.setHtml(
                    "<span style='font-size: 12pt'>Angle (2*Theta)={:0.1f}, \
                     <span style='color: black'>Intensivity (Angstrom)={:0.1f} 
                     </span>".format(
                        mousePoint.x(), mousePoint.y()))
            self.vLine.setPos(mousePoint.x())
            self.hLine.setPos(mousePoint.y())

Ответы

▲ 0

Итак, нашел причину. Оказывается, отображение координат является неотъемлемой частью графика, которая привязана не к координатам графика, а к координатам виджета. Текст выходит за границы виджета, и программа начинает считать, что текст находится за зоной отображения, из-за чего она начинает менять масштаб. Но из-за этой привязки к виджету, а не графику, это превращается в бесконечное автоматическое уменьшение масштаба.

В итоге, решение данной проблемы следующие:

  • Увеличение размеров виджета, чтобы его границы не заходили и не перекрывали текст с координатами

или

  • Уменьшение размера текста (с тем же условием, что и для решения с размерами виджета)

или

  • Изменение положения отображения координат ближе к нулевой координате графика