Trifon Trifonov
Trifon Trifonov

Reputation: 75

pyqtgraph: How to link two PlotWidget windows to show the same plot?

I am developing an orbital analysis tool using PyQT5 and pyqtgraph!

See: https://github.com/3fon3fonov/trifon

My tool has a plotting area with ~15 plots shown in different tab windows, which show different aspects of the data analysis.

The tool it self is assembled with the Designer-qt5, while the QGraphicView widgets are promoted to pyqtgraphs's PlotWidgets

For example in the gui.py I initialize the plots like this:

def initialize_plots(self):
    global p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,pe
    p1  = self.graphicsView_timeseries_RV
    p2  = self.graphicsView_timeseries_RV_o_c
    p3  = self.graphicsView_timeseries_phot
    p4  = self.graphicsView_timeseries_phot_o_c
    p5  = self.graphicsView_timeseries_activity
    p6  = self.graphicsView_timeseries_correlations
    # ...
    pe  = self.graphicsView_extra_plot
    # ...

so p1-p6 in this case are different PlotWidget objects on which I add Items/Plot data, i.e. p1.plot(x,y), p1.addItem(), etc.

What I want is to link pe to any of p1-p6!. pe is an extra plot so the user can choose from those already available/created. Thus the user can select which plot he/she wants to see next to the main plot.

Lets imagine that the ComboBox dropdown menu selects between p1-p6 objects, so

pe = p1, or later: pe = p4

for example.

Is there any way this to be done with PyQtgraph?

I really tried all kind things in the last two weeks and nothing seems to work.

I am aware of the

pe.setXLink(p1)
pe.setYLink(p2)

but this only links the axes not the plot object itself. It doesn't work for me.

Upvotes: 0

Views: 1504

Answers (1)

CRose
CRose

Reputation: 108

I implemented something like that using Docks and a DockArea. I simply added several docks stacked below each other. They can be shown using either by clicking on the labels or by using the raiseDock() method of each dock.

You can simply add the PlotWidget (or any other Widget) to the dock using the addWidget() method of each dock. The labels can be hidden or locked if you don't want the user to be able to move the docks at runtime.

import sys
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui
from pyqtgraph.dockarea import DockArea, Dock

class Accel_GUI():
    def __init__(self, window, dock_area):
        self.testing = 0
        self.pen = pg.mkPen(color='y')
        """Setup the UI"""
        self.window = window
        self.dock_area = dock_area
        self.window.setCentralWidget(self.dock_area)
        self.spec_dock = []
        self.spec_dock.append(Dock("Spectro 1",
                                   size=(1200, 600),
                                  autoOrientation=False))
        self.spec_dock.append(Dock("Spectro 2",
                                   size=(1200, 600),
                               autoOrientation=False))
        self.dock_area.addDock(self.spec_dock[0], "top")
        self.dock_area.addDock(self.spec_dock[1], "below", self.spec_dock[0])

if __name__ == "__main__":
    app = QtGui.QApplication.instance()
    if app is None:
        app = QtGui.QApplication(argv)
    win = QtGui.QMainWindow()
    area = DockArea()
    pyqtplot = Accel_GUI(win, area)
    win.show()
    app.exec_()

There is also an example in the pyqtgraph library that shows how to work with docks.

Upvotes: 0

Related Questions