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