Pyqtgraph: AxisItem kelebihan beban hanya menampilkan data asli

Saya sedang membangun aplikasi untuk melihat data waktu nyata berdasarkan contoh plot bergulir. Sumbu x saya akan menampilkan waktu sebagai string yang diformat. Nilai x yang ditambahkan ke plot adalah stempel waktu yang mengapung dalam hitungan detik. Ini adalah versi sederhana dari kode jendela plot saya.

Semuanya berfungsi dalam waktu nyata dan saya tidak memiliki masalah dalam menampilkan nilai yang ingin saya plot, tetapi label untuk sumbu x saya hanyalah stempel waktu, bukan string yang diformat. Saya tahu bahwa fungsi formatTimestampToString(val) dalam kelebihan AxisItem mengembalikan nilai string yang baik.

import pyqtgraph as pg


class NewLegend(pg.LegendItem):
    def __init__(self, size=None, offset=None):
        pg.LegendItem.__init__(self, size, offset)

    def paint(self, p, *args):
        p.setPen(pg.mkPen(0,0,0)) # outline
        p.setBrush(pg.mkBrush(255,255,255)) # background
        p.drawRect(self.boundingRect())


class DateAxis(pg.AxisItem):
    def tickStrings(self, values, scale, spacing):
        strings = []
        for val in values:
             strings.append(formatTimestampToString(val))
        return strings


class PlotWindow(QtWidgets.QWidget):

    def __init__(self, iof, num):
        QtWidgets.QWidget.__init__(self)
        self.setWindowTitle('Plot Window ')
        self.resize(1000, 800)

        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')

        """
        ... other stuff ...
        """

        # Externally updated dict with data
        self.data = {}

        self.curves = {}

        self.plotWidget = pg.GraphicsWindow("Graph Window")

        axis = DateAxis(orientation='bottom')
        self.plot = self.plotWidget.addPlot(axisItem={'bottom': axis})
        self.plot.setAutoPan(x=True)
        self.legend = NewLegend(size=(100, 60), offset=(70, 30))
        self.legend.setParentItem(self.plot.graphicsItem())

    def updatePlots(self):
        #update data for the different curves
        for data_name, curve in self.curves.items():
            if curve != 0:
                curve.setData(y=self.data[data_name].values[:], x=self.data[data_name].timestamps[:])

    def addCurve(self, data_name):
        if data_name not in self.curves:
                self.curves[data_name] = self.plot.plot(y=self.data[data_name].values[:], x=self.data[data_name].timestamps[:], pen=pg.mkPen(color=self.randomColor(),width=3))
                self.legend.addItem(self.curves[data_name], name=data_name)

    def removeCurve(self, data_name):
        if data_name in self.curves:
            self.plot.removeItem(self.curves[data_name])
            self.legend.removeItem(data_name)
            del self.curves[data_name]

Apakah saya melakukan sesuatu yang salah? Apakah ada cara yang lebih baik untuk membebani AxisItem secara berlebihan? Saya juga mencoba membebani AxisItem dengan rumus numerik sederhana hanya untuk melihat apakah itu berpengaruh pada sumbu saya.

Masalah lain yang saya alami adalah dengan LegendItem: Saya dapat menambah dan mengurangi label tanpa masalah, tetapi hanya memperbarui ukuran kotak legenda saat menambahkan label. Artinya ketika saya menambah dan menghapus kurva/data di plot saya, legendanya bertambah, tetapi tidak pernah menyusut lagi. Saya telah mencoba memanggil fungsi LegendItem.updateSize() setelah menghapus label, tetapi tidak terjadi apa-apa.

Saya harap Anda dapat membantu! Terima kasih


person Jørgen Jackwitz    schedule 07.11.2018    source sumber


Jawaban (1)


Jadi saya menemukan masalahnya. Di self.plot = self.plotWidget.addPlot(axisItem={'bottom': axis}) seharusnya tertulis axisItems, bukan axisItem.

person Jørgen Jackwitz    schedule 08.11.2018