An oscilloscope-style signal viewer plugin for PlotJuggler. Displays time series data as step-wise (staircase) traces with individually positionable Y-axis bars, multi-file overlay comparison, and time shifting.
Companion plugins:
- plotjuggler-zenoh — DataStreamer plugin for live data over Zenoh
- Step-wise signal traces with per-pixel downsampling for smooth rendering at any zoom level
- Three-column Y-axis panel: signal names, cursor readout values, and draggable Y-axis bars with tick marks
- Multi-file data overlay: load CSV files on top of PlotJuggler data for side-by-side comparison; right-click the data-sets footer to remove individual overlays or clear all at once
- Time shifting: drag to shift any data layer's time offset for alignment
- Horizontal zoom: rubber-band drag or scroll wheel to zoom the time axis; right-click to pan (pre-pan range saved to history); Prev Zoom button steps back through the full zoom history
- Flexible signal bands: independently position, resize, and group signal display regions
- Signal context menu: right-click any signal's name, value, or Y-axis bar to auto-scale, change style, group, or remove — applies to all selected signals when the right-clicked signal is part of the selection
- Selection and batch editing: select signals with click, Ctrl+click, rubber band, or Ctrl+A; edit properties in bulk via the Y-range table dialog
- Customizable appearance: per-signal color, line style, line width, marker style, and Y-axis divisions
- Streaming mode: auto-scroll the time axis to follow live DataStreamer data with configurable buffer time; auto-enables on stream start, pauses data on user interaction, and resumes cleanly
- Layout persistence: full save/restore of signal configuration, overlays, streaming state, and view state via PlotJuggler layout files
- Plot cursor navigation: double-click to jump the cursor, drag within 5 px to slide it, or use left/right arrow keys for single-pixel steps
- Dark/Light theme: toggle between dark (default) and light mode; signal colors are converted via an invertible HSL lightness mirror so switching back always restores the original colors exactly; theme is saved and restored with the layout
- Click Add Signal to add signals to the view
- Double-click a signal name, value, or bar to edit properties (color, line style, Y range, etc.)
- Right-click a signal name, value, or bar to auto-scale, change style, group, or remove (applies to all selected signals)
- Click Overlay to load a CSV file for comparison; right-click the data-sets footer to rename, remove, or clear all overlays
- Toggle Time Shift and drag on the canvas to align data layers
- Toggle H. Zoom and drag to zoom into a time range, or scroll the wheel to zoom centered on the mouse; right-click to pan
- Click Prev Zoom to step back through previous zoom ranges one at a time
- Toggle Stream for live data: auto-scrolls with incoming data; pan/zoom/cursor drag pauses the stream; click Stream again to resume
- Click Dark/Light to switch themes
Pre-built plugin binaries are available on the Releases page. Each release is built against a specific PlotJuggler version (noted in the filename and release notes).
-
Download the plugin file for your OS:
- Linux:
libSignalViewPlugin-<version>-pj<pj_version>.so - Windows:
SignalViewPlugin-<version>-pj<pj_version>.dll
- Linux:
-
Copy the file into PlotJuggler's plugins directory:
OS Plugins directory Linux (source install) <plotjuggler-install>/lib/plotjuggler/plugins/Linux (apt/ROS) /opt/ros/<distro>/lib/plotjuggler/plugins/or/usr/lib/plotjuggler/plugins/Windows <plotjuggler-install>\lib\plotjuggler\plugins\ -
Restart PlotJuggler — Signal View will appear under Tools.
- PlotJuggler 3.x (built and installed from source)
- Qt 5
- CMake 3.16+
- fmt library (bundled with PlotJuggler)
Linux (Ubuntu/Debian):
sudo apt install qtbase5-dev cmakeWindows:
- Visual Studio 2026 with the v142 (VS 2019) C++ toolchain installed
- Qt 5.15 via aqtinstall:
pip install aqtinstall && aqt install-qt windows desktop 5.15.2 win64_msvc2019_64 -O C:\Qt - PlotJuggler must be built from source and installed via
cmake --installto produce the install tree
If plotjuggler is on your PATH, the build script auto-detects the install prefix:
./build.shOtherwise, set PJ_INSTALL_DIR manually:
PJ_INSTALL_DIR=/path/to/plotjuggler-install ./build.shIf both qmake and plotjuggler are on your PATH, the build script auto-detects both:
build.batOtherwise, set the directories manually:
set QT_DIR=C:\Qt\5.15.2\msvc2019_64
set PJ_INSTALL_DIR=C:\path\to\plotjuggler-install
build.batThe script defaults to Visual Studio 2026. To use Visual Studio 2022 instead:
build.bat vs2022Both generators require the v142 (VS 2019) C++ toolchain to be installed, as Qt 5.15 was built against it.
./run.sh # launch PlotJuggler with the plugin
./run.sh -d data.csv # load a data file
./run.sh -l layout.xml # restore a saved layoutrun.bat # launch PlotJuggler with the plugin
run.bat -d data.csv # load a data file
run.bat -l layout.xml # restore a saved layoutAny additional arguments are passed through to PlotJuggler.
Then go to Tools > Signal View to open the plugin.
Run the unit tests with:
./test.shThis builds with Google Test and runs all test suites via CTest. Tests cover name parsing, overlay manager logic, axis layout calculations, CSV parsing, UI widget interactions, and Dark/Light theme logic.
To output JUnit XML results (used by CI for test reporting):
JUNIT_OUTPUT=test-results.xml ./test.shtest.batTo use Visual Studio 2022:
test.bat vs2022To output JUnit XML results:
set JUNIT_OUTPUT=test-results.xml
test.bat vs2022- Google C++ formatting (
clang-format -style=Google) - Qt naming conventions:
m_member prefix,UPPER_CASEconstants,camelCasefunctions,PascalCaseclasses
src/
signal_view_plugin.h/cpp Plugin entry point (PJ::ToolboxPlugin)
signal_view_widget.h/cpp Main widget: toolbar, layout, signal management
plot_canvas.h/cpp Time series rendering and mouse interaction
y_axis_panel.h/cpp Signal name, value, and Y-axis bar columns
overlay_manager.h/cpp Multi-layer data management and CSV loading
data_sets_panel.h/cpp Footer panel listing loaded data layers
