Skip to content
Snippets Groups Projects

Update plot window

Merged Oscar Gustafsson requested to merge plot_window2 into master
1 file
+ 48
42
Compare changes
  • Side-by-side
  • Inline
@@ -2,7 +2,7 @@
# TODO's:
# * Solve the legend update. That isn't working at all.
# * Zoom etc. Might need to change FigureCanvas. Or just something very little.
# * Add a function to run this as a "stand-alone".
import re
import sys
@@ -12,49 +12,48 @@ from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as Navigatio
from matplotlib.figure import Figure
from matplotlib.ticker import MaxNLocator
from qtpy.QtCore import Qt
from qtpy.QtGui import QKeySequence
# Intereme imports for the Plot class:
from qtpy.QtWidgets import ( # QFrame,; QScrollArea,; QLineEdit,; QSizePolicy,; QLabel,
from qtpy.QtWidgets import ( # QFrame,; QScrollArea,; QLineEdit,; QSizePolicy,; QLabel,; QFileDialog,; QShortcut,
QApplication,
QCheckBox,
QDialog,
QFileDialog,
QHBoxLayout,
QListWidget,
QListWidgetItem,
QPushButton,
QShortcut,
QVBoxLayout,
)
# from qtpy.QtGui import QKeySequence
class PlotCanvas(FigureCanvas):
"""PlotCanvas is used as a part in the PlotWindow."""
def __init__(self, logger, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
super().__init__(fig)
self.axes = fig.add_subplot(111)
self.axes.xaxis.set_major_locator(MaxNLocator(integer=True))
self.legend = None
self.logger = logger
# class PlotCanvas(FigureCanvas):
# """PlotCanvas is used as a part in the PlotWindow."""
FigureCanvas.updateGeometry(self)
self.save_figure = QShortcut(QKeySequence("Ctrl+S"), self)
self.save_figure.activated.connect(self._save_plot_figure)
# def __init__(self, logger, parent=None, width=5, height=4, dpi=100):
# fig = Figure(figsize=(width, height), dpi=dpi)
# super().__init__(fig)
# self.axes = fig.add_subplot(111)
# self.axes.xaxis.set_major_locator(MaxNLocator(integer=True))
# self.legend = None
# self.logger = logger
def _save_plot_figure(self):
self.logger.info(f"Saving plot of figure: {self.sfg.name}.")
file_choices = "PNG (*.png)|*.png"
path, ext = QFileDialog.getSaveFileName(self, "Save file", "", file_choices)
path = path.encode("utf-8")
if not path[-4:] == file_choices[-4:].encode("utf-8"):
path += file_choices[-4:].encode("utf-8")
# FigureCanvas.updateGeometry(self)
# self.save_figure = QShortcut(QKeySequence("Ctrl+S"), self)
# self.save_figure.activated.connect(self._save_plot_figure)
if path:
self.print_figure(path.decode(), dpi=self.dpi)
self.logger.info(f"Saved plot: {self.sfg.name} to path: {path}.")
# def _save_plot_figure(self):
# self.logger.info(f"Saving plot of figure: {self.sfg.name}.")
# file_choices = "PNG (*.png)|*.png"
# path, ext = QFileDialog.getSaveFileName(self, "Save file", "", file_choices)
# path = path.encode("utf-8")
# if not path[-4:] == file_choices[-4:].encode("utf-8"):
# path += file_choices[-4:].encode("utf-8")
# if path:
# self.print_figure(path.decode(), dpi=self.dpi)
# self.logger.info(f"Saved plot: {self.sfg.name} to path: {path}.")
class PlotWindow(QDialog):
@@ -101,7 +100,7 @@ class PlotWindow(QDialog):
sim_res_others[key] = sim_result[key]
# Layout: ############################################
# | list | |
# | list | icons |
# | ... | plot |
# | misc | |
@@ -117,18 +116,25 @@ class PlotWindow(QDialog):
########### Plot: ##############
# Do this before the list layout, as the list layout will re/set visibility
# Note: The order is of importens. Interesting lines last, to be on top.
self.plotcanvas = PlotCanvas(
logger=logger, parent=self, width=5, height=4, dpi=100
)
# self.plotcanvas = PlotCanvas(
# logger=logger, parent=self, width=5, height=4, dpi=100
# )
self._plot_fig = Figure(figsize=(5, 4), dpi=100)
self._plot_axes = self._plot_fig.add_subplot(111)
self._plot_axes.xaxis.set_major_locator(MaxNLocator(integer=True))
self._lines = {}
for key in sim_res_others | sim_res_delays | sim_res_ins | sim_res_outs:
line = self.plotcanvas.axes.plot(sim_result[key], visible=False, label=key)
# line = self.plotcanvas.axes.plot(sim_result[key], visible=False, label=key)
line = self._plot_axes.plot(sim_result[key], visible=False, label=key)
self._lines[key] = line
self.plotcanvas.legend = self.plotcanvas.axes.legend()
# self.plotcanvas.legend = self.plotcanvas.axes.legend()
self._legend = self._plot_axes.legend()
self._plot_canvas = FigureCanvas(self._plot_fig)
plotlayout.addWidget(NavigationToolbar(self.plotcanvas, self))
plotlayout.addWidget(self.plotcanvas)
plotlayout.addWidget(NavigationToolbar(self._plot_canvas, self))
plotlayout.addWidget(self._plot_canvas)
########### List layout: ##############
@@ -178,11 +184,11 @@ class PlotWindow(QDialog):
self._auto_redraw = True
def _legend_checkbox_change(self, checkState):
self.plotcanvas.legend.set(visible=(checkState == Qt.CheckState.Checked))
self._legend.set(visible=(checkState == Qt.CheckState.Checked))
if self._auto_redraw:
if checkState == Qt.CheckState.Checked:
self.plotcanvas.legend = self.plotcanvas.axes.legend()
self.plotcanvas.draw()
self._legend = self._plot_axes.legend()
self._plot_canvas.draw()
# def _ontop_checkbox_change(self, checkState):
# Bugg: It seems the window closes if you change the WindowStaysOnTopHint.
@@ -196,14 +202,14 @@ class PlotWindow(QDialog):
for x in range(self.checklist.count()):
self.checklist.item(x).setCheckState(Qt.CheckState.Checked)
self._auto_redraw = True
self.plotcanvas.draw()
self._plot_canvas.draw()
def _button_none_click(self, event):
self._auto_redraw = False
for x in range(self.checklist.count()):
self.checklist.item(x).setCheckState(Qt.CheckState.Unchecked)
self._auto_redraw = True
self.plotcanvas.draw()
self._plot_canvas.draw()
def _item_change(self, listitem):
key = listitem.text()
@@ -212,8 +218,8 @@ class PlotWindow(QDialog):
)
if self._auto_redraw:
if self.legend_checkbox.checkState == Qt.CheckState.Checked:
self.plotcanvas.legend = self.plotcanvas.axes.legend()
self.plotcanvas.draw()
self._legend = self._plot_axes.legend()
self._plot_canvas.draw()
# Simple test of the dialog
Loading