Go to file
Lev Maximov a76d9daec2
Date axis item (#1154)
* Add DateAxisItem

* Change style to camelCase

* Fix missing first tick for negative timestamps

* Add ms precision, auto skipping

Auto skipping allows a zoom level to skip ticks automatically if the
maximum number of ticks/pt is exceeded

* fixes suggested by @goetzc

* workaround for negative argument to utcfromtimestamp on windows

* attachToPlotItem method

* default date axis orientation

* Use new DateAxisItem in Plot Customization example

* attachToPlotItem bugfix

* examples of DateAxisItem

* modified description of customPlot example

* added descriptions to the new examples, reformatted their code, included the first one into utils.py

* typo

* Refactored code for setting axis items into new function

Replaces "DateAxisItem.attachToPlotItem"

* Fix string comparison with ==

* Doc: Slightly more text for DateAxisItem, small improvement for PlotItem

* Make PlotWidget.setAxisItems official

* Fix typo in docstring

* renamed an example

* merge bug fix

* Revert "merge bug fix"

This reverts commit 876b5a7cdb.

* Real bug fix

* support for dates upto -1e13..1e13

* Automatically limit DateAxisItem to a range from -1e12 to 1e12 years

Very large years (|y|>1e13) cause infinite loop, and since nobody
needs time 100 times larger than the age of the universe anyways,
this constrains it to 1e12.

Following suggestion by @axil:
https://github.com/pyqtgraph/pyqtgraph/pull/1154#issuecomment-612662168

* Also catch ValueErrors occuring on Linux before OverfloeErrors

While zooming out, before hitting OverflowErrors, utctimestamp
produces ValueErrors (at least on my Linux machine), so they
are also catched.

* Fix: Timestamp 0 corresponds to year 1970

For large years, x axis labels jump by 1970 years if it is not
accounted for timestamp 0 to be equal to year 1970.

* Fix: When zooming into extreme dates, OSError occurs

This commit catches the OSError like the other observed errors

* Disable stepping below years for dates outside *_REGULAR_TIMESTAMP

2 reasons: First: At least on my Linux machine, zooming into
those dates creates infinite loops. Second: Nobody needs
sub-year-precision for those extreme years anyways.

* Adapt zoom level sizes based on current font size and screen resolution

This is somewhat experimental. With this commit, no longer 60 px are
assumed as width for all zoom levels, but the current font and
display resolution are considered to calculate the width of ticks in
each zoom level. See the new function `updateZoomLevels` for
details.
Before calling this function, overridden functions `paint` and
`generateDrawSpecs` provide information over the current display
and font via `self.fontScaleFactor` and `self.fontMetrics`.

* Meaningful error meassage when adding axis to multiple PlotItems

As @axil noted in the DateAxisItem PR, currently users get a
segmentation fault when one tries to add an axis to multiple
PlotItems. This commit adds a meaningful RuntimeError message
for that case.

* setZoomLevelForDensity: Refactoring and calculating optimal spacing on the fly

* DateTimeAxis Fix: 1970 shows when zooming far out

* Refactoring: Make zoomLevels a customizable dict again

* updated the dateaxisitem example

* Fix: Get screen resolution in a way that also works for Qt 4

This is both a simplification in code and an improvement in backwards compatibility with Qt 4.

* DateAxisItem Fix: Also resolve time below 0.5 seconds

* unix line endings in examples

* DateTimeAxis Fix: For years < 1 and > 9999, stepping broke

Stepping was off by 1970 years for years < 1 and > 9999,
resulting in a gap in ticks visible when zooming out. Fixed by
subtracting the usual 1970 years.

* DateTimeAxis Fix: Zooming out too far causes infinite loop

Fixed by setting default limits to +/- 1e10 years. Should still
be enough.

* improved second dateaxisitem example

* 1..9999 years limit

* DateTimeAxis: Use OrderedDict to stay compatible with Python < 3-6

* DateAxisItem: Use font height to determine spacing for vertical axes

* window title

* added dateaxisitem.rst

* updated index.rst

Co-authored-by: Lukas Heiniger <lukas.heiniger@sed.ethz.ch>
Co-authored-by: Lev Maximov <lev.maximov@gmail.com>
Co-authored-by: 2xB <2xB@users.noreply.github.com>
2020-04-27 11:43:22 -07:00
.github/ISSUE_TEMPLATE Add issue template (#976) 2019-07-02 10:26:51 -04:00
doc Date axis item (#1154) 2020-04-27 11:43:22 -07:00
examples Date axis item (#1154) 2020-04-27 11:43:22 -07:00
pyqtgraph Date axis item (#1154) 2020-04-27 11:43:22 -07:00
tools Expand CI + pre-commit (#991) 2019-08-29 13:56:25 -07:00
.coveragerc MNT: hard code the coverage report location 2015-08-01 11:54:15 -04:00
.flake8 Expand CI + pre-commit (#991) 2019-08-29 13:56:25 -07:00
.gitignore TST: Attempt 1 at breaking out ViewBox tests 2015-07-31 11:08:14 -04:00
.pre-commit-config.yaml Expand CI + pre-commit (#991) 2019-08-29 13:56:25 -07:00
azure-pipelines.yml Skipping problematic test on py2/qt4/linux 2020-02-24 22:30:27 -08:00
azure-test-template.yml Skipping problematic test on py2/qt4/linux 2020-02-24 22:30:27 -08:00
CHANGELOG Update Changelog with PRs merged since August 2019-12-15 21:54:36 -06:00
CONTRIBUTING.md Update readme and contributing files 2020-02-28 14:48:24 -08:00
LICENSE.txt - Major reorganization; we now follow the standard python package structure. 2012-12-26 17:51:52 -05:00
MANIFEST.in manifest corrections 2014-12-24 11:05:05 -05:00
pytest.ini Filter out expected warnings 2020-02-28 14:28:36 -08:00
README.md Update readme and contributing files 2020-02-28 14:48:24 -08:00
setup.py remote legacy work-around for old numpy errors (#1046) 2019-09-26 10:08:43 -07:00
test.py We support pyside2 don't we? 2019-05-30 14:40:39 -07:00
tox.ini Remove py2 pip warning message 2020-02-28 14:29:16 -08:00

Build Status

PyQtGraph

A pure-Python graphics library for PyQt/PySide/PyQt5/PySide2

Copyright 2019 Luke Campagnola, University of North Carolina at Chapel Hill

http://www.pyqtgraph.org

PyQtGraph is intended for use in mathematics / scientific / engineering applications. Despite being written entirely in python, the library is fast due to its heavy leverage of numpy for number crunching, Qt's GraphicsView framework for 2D display, and OpenGL for 3D display.

Requirements

  • PyQt 4.8+, PySide, PyQt5, or PySide2
    • PySide2 5.14 does not have loadUiType functionality, and thus the example application will not work. You can follow along with restoring that functionality here.
  • Python 2.7, or 3.x
  • Required
    • numpy
  • Optional
    • scipy for image processing
    • pyopengl for 3D graphics
      • macOS with Python2 and Qt4 bindings (PyQt4 or PySide) do not work with 3D OpenGL graphics
      • pyqtgraph.opengl will be depreciated in a future version and replaced with VisPy
    • hdf5 for large hdf5 binary format support
  • Known to run on Windows, Linux, and macOS.

Qt Bindings Test Matrix

The following table represents the python environments we test in our CI system. Our CI system uses Ubuntu 18.04, Windows Server 2019, and macOS 10.15 base images.

Qt-Bindings Python 2.7 Python 3.6 Python 3.7 Python 3.8
PyQt-4
PySide1
PyQt-5.9
PySide2-5.13
PyQt-5.14
  • pyqtgraph has had some incompatabilities with PySide2-5.6, and we recommend you avoid those bindings if possible
  • on macOS with Python 2.7 and Qt4 bindings (PyQt4 or PySide) the openGL related visualizations do not work

Support

Installation Methods

  • From PyPI:
    • Last released version: pip install pyqtgraph
    • Latest development version: pip install git+https://github.com/pyqtgraph/pyqtgraph@develop
  • From conda
    • Last released version: conda install pyqtgraph
  • To install system-wide from source distribution: python setup.py install
  • Many linux package repositories have release versions.
  • To use with a specific project, simply copy the pyqtgraph subdirectory anywhere that is importable from your project.
  • For installation packages, see the website (pyqtgraph.org)

Documentation

The easiest way to learn pyqtgraph is to browse through the examples; run python -m pyqtgraph.examples for a menu.

The official documentation lives at http://pyqtgraph.org/documentation