Как установить смещение метки оси pyqtgraph? - PullRequest
1 голос
/ 04 июля 2019

Мне нужно реализовать довольно маленькие графики Pyqtgraph в графическом интерфейсе. При этом по умолчанию смещение метки axis ' слишком велико. Как установить смещение метки оси, а не отметок оси.

В следующем примере кода создается базовый график pyqtgraph. Мне удалось установить смещение текста галочки, но не только смещение текста метки. Я бы хотел, чтобы метки осей были ближе к оси.

import numpy as np
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

app = QtGui.QApplication([])

x = np.linspace(0, 1, 10000)
y = np.linspace(350, 2500, 10000)


win = pg.GraphicsWindow()
plot = win.addPlot(x=x, y=y, title="Plot")
label_style = {'color': '#EEE', 'font-size': '14pt'}
plot.setLabel('bottom', "some x axis label", **label_style)
plot.setLabel('left', "some y axis label")
plot.getAxis('left').setLabel(**label_style)

font=QtGui.QFont()
font.setPixelSize(14)
plot.getAxis("bottom").tickFont = font

# Here I increased the tickTextOffset of the x axis
plot.getAxis("bottom").setStyle(tickTextOffset=50)

plot.getAxis("left").tickFont = font
plot.getAxis("left").setStyle(tickTextOffset=14)

if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

Любая помощь очень ценится!

Обновление :

Я нашел внутреннее решение pyqtgraph в pyqtgraph.AxisItem.resizeEvent(), но функция не принимает переданные аргументы.

    def resizeEvent(self, ev=None):
        #s = self.size()

        ## Set the position of the label
        nudge = 5
        br = self.label.boundingRect()
        p = QtCore.QPointF(0, 0)
        if self.orientation == 'left':
            p.setY(int(self.size().height()/2 + br.width()/2))
            p.setX(-nudge)
        elif self.orientation == 'right':
            p.setY(int(self.size().height()/2 + br.width()/2))
            p.setX(int(self.size().width()-br.height()+nudge))
        elif self.orientation == 'top':
            p.setY(-nudge)
            p.setX(int(self.size().width()/2. - br.width()/2.))
        elif self.orientation == 'bottom':
            p.setX(int(self.size().width()/2. - br.width()/2.))
            p.setY(int(self.size().height()-br.height()+nudge))
        self.label.setPos(p)
        self.picture = None

соответствующая переменная nudge. К сожалению, он недоступен или есть способ обойти resizeEvent() без изменения исходного кода pyqtgraph?

В качестве предложения сделать nudge сносным я создал проблему с pyqtgraph GitHub:

1 Ответ

1 голос
/ 05 июля 2019

Одним из решений является создание пользовательского AxisItem и переопределение этого метода. Для вызова resizeEvent вы можете сделать ложное изменение размера:

import numpy as np
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg


class CustomAxis(pg.AxisItem):
    @property
    def nudge(self):
        if not hasattr(self, "_nudge"):
            self._nudge = 5
        return self._nudge

    @nudge.setter
    def nudge(self, nudge):
        self._nudge = nudge
        s = self.size()
        # call resizeEvent indirectly
        self.resize(s + QtCore.QSizeF(1, 1))
        self.resize(s)

    def resizeEvent(self, ev=None):
        # s = self.size()

        ## Set the position of the label
        nudge = self.nudge
        br = self.label.boundingRect()
        p = QtCore.QPointF(0, 0)
        if self.orientation == "left":
            p.setY(int(self.size().height() / 2 + br.width() / 2))
            p.setX(-nudge)
        elif self.orientation == "right":
            p.setY(int(self.size().height() / 2 + br.width() / 2))
            p.setX(int(self.size().width() - br.height() + nudge))
        elif self.orientation == "top":
            p.setY(-nudge)
            p.setX(int(self.size().width() / 2.0 - br.width() / 2.0))
        elif self.orientation == "bottom":
            p.setX(int(self.size().width() / 2.0 - br.width() / 2.0))
            p.setY(int(self.size().height() - br.height() + nudge))
        self.label.setPos(p)
        self.picture = None


app = QtGui.QApplication([])

x = np.linspace(0, 1, 10000)
y = np.linspace(350, 2500, 10000)


win = pg.GraphicsWindow()
plot = win.addPlot(
    x=x, y=y, title="Plot", axisItems={"bottom": CustomAxis(orientation="bottom")}
)

label_style = {"color": "#EEE", "font-size": "14pt"}
plot.setLabel("bottom", "some x axis label", **label_style)
plot.setLabel("left", "some y axis label")
plot.getAxis("left").setLabel(**label_style)
font = QtGui.QFont()
font.setPixelSize(14)
plot.getAxis("bottom").tickFont = font
plot.getAxis("bottom").setStyle(tickTextOffset=50)

plot.getAxis("left").tickFont = font
plot.getAxis("left").setStyle(tickTextOffset=14)


def on_timeout():
    plot.getAxis("bottom").nudge += 1

timer = QtCore.QTimer(timeout=on_timeout, interval=500)
timer.start() 

if __name__ == "__main__":
    import sys

    if (sys.flags.interactive != 1) or not hasattr(QtCore, "PYQT_VERSION"):
        QtGui.QApplication.instance().exec_()
...