PyQtGraph is a graphics and user interface library for Python that focuses on real-time plotting, scientific visualization, and interactive graphics.
It is built on top of PyQt (or PySide) and NumPy, making it a great choice for Python developers who need speed, responsiveness, and flexibility in their GUI and plotting solutions.
Where traditional plotting libraries like Matplotlib excel at static plots, PyQtGraph shines when real-time interactivity and high-frequency updates are required.
History and Background
PyQtGraph was originally developed to meet the needs of scientific and industrial users who needed fast visualization of large datasets. The first version was released in 2011, and it has since evolved with contributions from the open-source community.
Its goal is to provide a plotting library that is:
- Lightweight
- Easy to integrate with PyQt applications
- Fast enough for real-time use
The project is maintained on GitHub and is open for contributions, making it an ideal choice for developers who value community-driven tools.
Key Features of PyQtGraph
PyQtGraph offers a wide range of features that make it stand out:
- Real-Time Plotting:
- Update graphs in milliseconds — ideal for monitoring or live dashboards.
- GPU Acceleration:
- Leverages OpenGL for 3D visualization and hardware-accelerated rendering.
- Multiple Plot Types:
- Line plots, scatter plots, histograms, bar graphs, and image plots.
- Region of Interest (ROI) Tools:
- Easily zoom, pan, and select data regions.
- Multiple Axes and Linked Views:
- Support for advanced GUI layouts and synchronized plots.
- Highly Customizable Widgets:
- Create custom data dashboards with ease.
- Open Source & Actively Maintained:
- Available under the MIT license.
How PyQtGraph Works (Technical Overview)
PyQtGraph operates as a layer between NumPy-based data structures and the Qt GUI framework. It provides Pythonic APIs that abstract away the complexity of Qt graphics.
Key technical components include:
- GraphicsLayoutWidget: The main container for plots.
- PlotWidget & PlotItem: Provide plot canvas and management.
- ImageView: For image analysis and display.
- Integration with PyQt/PySide signals and slots.
Because it’s tightly integrated with NumPy, PyQtGraph can handle large datasets efficiently and offers fast drawing times even with millions of data points.
Installing PyQtGraph is straightforward using pip:
bashpip install pyqtgraph
If you want to use OpenGL-based 3D rendering, you’ll also need:
bashpip install pyopengl
Alternatively, clone from GitHub for the latest development version:
bashgit clone https://github.com/pyqtgraph/pyqtgraph
cd pyqtgraph
python setup.py install
PyQtGraph is compatible with Python 3.6+ and works on all major platforms: Windows, macOS, and Linux.
Basic Plotting Example
Here’s a simple example to get you started:
pythonimport pyqtgraph as pg
from pyqtgraph.Qt import QtWidgets
import numpy as np
import sys
app = QtWidgets.QApplication(sys.argv)
win = pg.plot()
x = np.linspace(0, 10, 1000)
y = np.sin(x)
win.plot(x, y, pen='g')
QtWidgets.QApplication.instance().exec_()
What’s happening:
- Creates a basic sine wave plot
- Uses green pen (
pen='g'
) - Runs a Qt application loop
Even with 1000+ data points, the plot renders instantly and remains responsive.
Advanced Functionalities
PyQtGraph supports a range of powerful capabilities beyond basic plots:
a. Image and Video Display
Display 2D images, manipulate contrast, and explore pixels in real-time.
b. 3D Visualization
Use GLViewWidget for 3D graphs, meshes, and vector fields.
c. Interactive ROI Tools
Drag, zoom, or resize custom shapes on plots for region selection.
d. Real-time sensor or Stream Monitoring
Perfect for applications like:
- ECG displays
- Stock price trackers
- Signal processing
e. Data Export & Snapshots
Easily export plot data to CSV or save figures as PNG.
PyQtGraph vs. Other Plotting Libraries
FeaturePyQtGraphMatplotlibPlotly
Real-time Speed ✅ Excellent ❌ Slow ⚠️ Moderate
GUI Integration ✅ PyQt Native ⚠️ External ❌ Browser-only
3D Support ✅ OpenGL ⚠️ Basic ✅ Strong
Interactivity ✅ High ⚠️ Limited ✅ High
Custom Widgets ✅ Extensive ⚠️ Few ❌ None
Summary:
Use PyQtGraph for speed and integration with PyQt apps. Use Matplotlib for static academic plots, and Plotly for interactive web-based dashboards.
Use Cases and Applications
PyQtGraph is used across industries, including:
- Medical Imaging:
- ECG, MRI, and ultrasound visualization.
- Physics and Engineering:
- Oscilloscope displays spectrum analyzers.
- Robotics and IoT:
- Real-time sensor feedback and motor diagnostics.
- Finance and Trading:
- Candlestick plots and streaming stock data.
- Academic Research:
- Simulation visualization, experimental data tracking.
Its open architecture allows deep customization for specific needs.
Limitations and Considerations
While powerful, PyQtGraph does have some caveats:
- Requires PyQt/PySide Knowledge:
- GUI development needs basic Qt knowledge.
- Not Ideal for Web Deployment:
- It’s a desktop-first library; for web apps, consider Plotly Dash.
- Limited Aesthetic Styles:
- It’s functional over flashy — doesn’t match Matplotlib’s publication-ready output without tweaks.
- Documentation Can Be Sparse in Places:
- Though improving, not all features are well-documented.
Community, Support, and Documentation
PyQtGraph is hosted on GitHub and welcomes contributions:
- Documentation
- GitHub Repo
- Discussions and Issues
Community activity is consistent, and the devs are responsive to issues. Many users also share tutorials on platforms like Stack Overflow, Reddit, and YouTube.
Conclusion and Recommendations
PyQtGraph is an outstanding choice for developers needing real-time, interactive plots and tight integration with PyQt-based GUIs. Whether you’re building a scientific dashboard, a custom data visualization tool, or a hardware interface, PyQtGraph delivers performance, flexibility, and ease of use.
If you’re already familiar with PyQt, adding PyQtGraph to your toolkit is a natural next step. Its power lies in bridging the gap between data and interaction, allowing you to build fully dynamic Python applications