33 from python_qt_binding
import QT_BINDING, QT_BINDING_VERSION
36 from pkg_resources
import parse_version
41 return [int(x)
for x
in re.sub(
r'(\.0+)*$',
'', s).split(
'.')]
43 if QT_BINDING ==
'pyside':
44 qt_binding_version = QT_BINDING_VERSION.replace(
'~',
'-')
46 raise ImportError(
'A PySide version newer than 1.1.0 is required.')
48 from python_qt_binding.QtCore
import Slot, Qt, qVersion, qWarning, Signal
49 from python_qt_binding.QtGui
import QColor
50 from python_qt_binding.QtWidgets
import QWidget, QVBoxLayout, QSizePolicy
54 if qVersion().startswith(
'5.'):
55 if QT_BINDING ==
'pyside':
57 raise ImportError(
'A newer matplotlib is required (at least 2.1.0 for PySide 2)')
59 raise ImportError(
'A newer matplotlib is required (at least 1.4.0 for Qt 5)')
61 matplotlib.use(
'Qt5Agg')
62 from matplotlib.backends.backend_qt5agg
import FigureCanvasQTAgg
as FigureCanvas
67 sys.modules[
'_thread'] = thread
68 from matplotlib.backends.backend_qt5agg
import FigureCanvasQTAgg
as FigureCanvas
69 from matplotlib.backends.backend_qt5agg
import NavigationToolbar2QT
as NavigationToolbar
70 elif qVersion().startswith(
'4.'):
72 raise ImportError(
'A newer matplotlib is required (at least 1.1.0 for Qt 4)')
74 matplotlib.use(
'Qt4Agg')
75 from matplotlib.backends.backend_qt4agg
import FigureCanvasQTAgg
as FigureCanvas
80 sys.modules[
'_thread'] = thread
81 from matplotlib.backends.backend_qt4agg
import FigureCanvasQTAgg
as FigureCanvas
83 from matplotlib.backends.backend_qt4agg
import NavigationToolbar2QTAgg
as NavigationToolbar
85 from matplotlib.backends.backend_qt4agg
import NavigationToolbar2QT
as NavigationToolbar
87 raise NotImplementedError(
'Unsupport Qt version: %s' % qVersion())
89 from matplotlib.figure
import Figure
98 """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
102 self.
axes = self.figure.add_subplot(111)
103 self.
axes.grid(
True, color=
'gray')
105 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
106 self.setMinimumSize(1,1)
107 self.updateGeometry()
115 Deal with "ValueError: bottom cannot be >= top" bug in older matplotlib versions
119 - https://github.com/matplotlib/matplotlib/pull/10915
120 - https://github.com/ros-visualization/rqt_plot/issues/35
123 if self.figure.get_figheight() == 0
or self.figure.get_figwidth() == 0:
125 self.figure.tight_layout()
130 limits_changed = Signal()
133 super(MatDataPlot, self).
__init__(parent)
148 def add_curve(self, curve_id, curve_name, curve_color=QColor(Qt.blue), markers_on=
False):
157 line = self.
_canvas.axes.plot([], [],
'o-', markersize=marker_size, label=curve_name,
158 linewidth=1, picker=5, color=curve_color.name())[0]
165 curve_id = str(curve_id)
167 self.
_curves[curve_id].remove()
172 handles, labels = self.
_canvas.axes.get_legend_handles_labels()
174 hl = sorted(zip(handles, labels), key=operator.itemgetter(1))
175 handles, labels = zip(*hl)
176 self.
_canvas.axes.legend(handles, labels, loc=
'upper left')
180 line.set_data(data_x, data_y)
183 self.
_canvas.axes.grid(
True, color=
'gray')
188 matcolor = (color[0] / 255.0, color[1] / 255.0, color[2] / 255.0)
194 self.
_canvas.axes.set_xbound(lower=limits[0], upper=limits[1])
197 self.
_canvas.axes.set_ybound(lower=limits[0], upper=limits[1])
200 return list(self.
_canvas.axes.get_xbound())
203 return list(self.
_canvas.axes.get_ybound())