# Purpose and Motivation

The `PythonQwt` project was initiated to solve -at least temporarily- the obsolescence issue of PyQwt (the Python-Qwt C++ bindings library) which is no longer maintained. The idea was to translate the original Qwt C++ code to Python and then to optimize some parts of the code by writing new modules based on NumPy and other libraries.

# Overview

The `PythonQwt` package consists of a single Python package named qwt and of a few other files (examples, doc, …):

> - The subpackage qwt.qt handles compatibility features between PyQt4, PyQt5 and PySide (source code strongly inspired from the Spyder project).

> - The subpackage qwt.tests contains the PythonQwt unit tests:

>   > - 75% were directly adapted from Qwt/C++ demos (Bode demo, cartesian demo, etc.).

>   > - 25% were written specifically for PythonQwt.

>   > - The test launcher is an exclusive PythonQwt feature.

The qwt package is a pure Python implementation of Qwt C++ library with the following limitations.

The following Qwt classes won’t be reimplemented in qwt because more powerful features already exist in guiqwt (and in the forthcoming plotpy library, resulting of the merge of guidata and guiqwt): QwtPlotZoomer, QwtCounter, QwtEventPattern, QwtPicker, QwtPlotPicker.

Only the following plot items are currently implemented in qwt (the only plot items needed by guiqwt and plotpy): QwtPlotItem (base class), QwtPlotItem, QwtPlotMarker, QwtPlotSeriesItem and QwtPlotCurve.

The HistogramItem object implemented in PyQwt’s HistogramDemo.py is not available here (a similar item is already implemented in guiqwt/plotpy). As a consequence, the following classes are not implemented: QwtPlotHistogram, QwtIntervalSeriesData, QwtIntervalSample.

The following data structure objects are not implemented as they seemed irrelevant with Python and NumPy: QwtCPointerData (as a consequence, method QwtPlot.setRawSamples is not implemented), QwtSyntheticPointData.

The following sample data type objects are not implemented as they seemed quite specific: QwtSetSample, QwtOHLCSample. For similar reasons, the QwtPointPolar class and the following sample iterator objects are not implemented: QwtSetSeriesData, QwtTradingChartData and QwtPoint3DSeriesData.

The following classes are not implemented because they seem inappropriate in the Python/NumPy context: QwtArraySeriesData, QwtPointSeriesData, QwtAbstractSeriesStore.

Threads:

> - Multiple threads for graphic rendering is implemented in Qwt C++ code thanks to the QtConcurrent and QFuture Qt features which are currently not supported by PyQt.

> - As a consequence the following API is not supported in PythonQwt:

>     - QwtPlotItem.renderThreadCount

>     - QwtPlotItem.setRenderThreadCount

>     - option numThreads in QwtPointMapper.toImage

The QwtClipper class is not implemented yet (and it will probably be very difficult or even impossible to implement it in pure Python without performance issues). As a consequence, when zooming in a plot curve, the entire curve is still painted (in other words, when working with large amount of data, there is no performance gain when zooming in).

The curve fitter feature is not implemented because powerful curve fitting features are already implemented in guiqwt/plotpy.

Other API compatibility issues with Qwt:

> - QwtPlotCurve.MinimizeMemory option was removed as this option has no sense in PythonQwt (the polyline plotting is not taking more memory than the array data that is already there).

> - QwtPlotCurve.Fitted option was removed as this option is not supported at the moment.