base on The Time Series Visualization Tool that you deserve. ![PlotJuggler](docs/plotjuggler3_banner.svg) [![windows](https://github.com/facontidavide/PlotJuggler/actions/workflows/windows.yaml/badge.svg)](https://github.com/facontidavide/PlotJuggler/actions/workflows/windows.yaml) [![ubuntu](https://github.com/facontidavide/PlotJuggler/actions/workflows/ubuntu.yaml/badge.svg)](https://github.com/facontidavide/PlotJuggler/actions/workflows/ubuntu.yaml) [![macos](https://github.com/facontidavide/PlotJuggler/actions/workflows/macos.yaml/badge.svg)](https://github.com/facontidavide/PlotJuggler/actions/workflows/macos.yaml) [![ROS1](https://github.com/facontidavide/PlotJuggler/workflows/ros1/badge.svg)](https://github.com/facontidavide/PlotJuggler/actions?query=workflow%3Aros1) [![ROS2](https://github.com/facontidavide/PlotJuggler/workflows/ros2/badge.svg)](https://github.com/facontidavide/PlotJuggler/actions?query=workflow%3Aros2) [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=I%20use%20PlotJuggler%20and%20it%20is%20amazing%0D%0A&url=https://github.com/facontidavide/PlotJuggler&via=facontidavide&hashtags=dataviz,plotjuggler,GoROS,PX4) ## Gold Sponsor: [![Greenzie](docs/sponsor_greenzie.png)](https://www.greenzie.com/) [![Intermodalics](docs/sponsor_intermodalics.png)](https://www.intermodalics.ai/) [![Greenzie](docs/sponsor_ark.png)](https://arkelectron.com/) # PlotJuggler 3.14 PlotJuggler is a tool to visualize time series that is **fast**, **powerful** and **intuitive**. Noteworthy features: - Simple Drag & Drop user interface. - Load __data from file__. - Connect to live __streaming__ of data. - Save the visualization layout and configurations to reuse them later. - Fast **OpenGL** visualization. - Can handle **thousands** of timeseries and **millions** of data points. - Transform your data using a simple editor: derivative, moving average, integral, etc… - PlotJuggler can be easily extended using __plugins__. ![PlotJuggler](docs/plotjuggler3.gif) ## Data sources (file and streaming) - Load CSV files. - Load [ULog](https://docs.px4.io/main/en/dev_log/ulog_file_format) (PX4). - Subscribe to many different streaming sources: MQTT, WebSockets, ZeroMQ, UDP, etc. - Understand data formats such as JSON, CBOR, BSON, Message Pack, etc. - Well integrated with [ROS](https://www.ros.org/): open *rosbags* and/or subscribe to ROS *topics* (both ROS1 and ROS2). - Supports the [Lab Streaming Layer](https://labstreaminglayer.readthedocs.io/info/intro.html), that is used by [many devices](https://labstreaminglayer.readthedocs.io/info/supported_devices.html). - Easily add your custom data source and/or formats... ![](docs/data_sources.svg) ## Transform and analyze your data PlotJuggler makes it easy to visualize data but also to analyze it. You can manipulate your time series using a simple and extendable Transform Editor. ![](docs/function_editor.png) Alternatively, you may use the Custom Function Editor, which allows you to create Multi-input / Single-output functions using a scripting language based on [Lua](https://www.tutorialspoint.com/lua/index.htm). If you are not familiar with Lua, don't be afraid, you won't need more than 5 minutes to learn it ;) ![](docs/custom_editor.png) ## Tutorials To learn how to use PlotJuggler, check the tutorials here: | Tutorial 1 | Tutorial 2 | Tutorial 3 | :-------------------------:|:-------------------------:|:-------------------------: | [![](docs/tutorial_1.png)](https://slides.com/davidefaconti/introduction-to-plotjuggler) | [![](docs/tutorial_2.png)](https://slides.com/davidefaconti/plotjuggler-data) | [![](docs/tutorial_3.png)](https://slides.com/davidefaconti/plotjuggler-transforms) | ## Supported plugins Some plugins can be found in a different repository. The individual README files *should* include all the information needed to compile and use the plugin. Please submit specific issues, Pull Requests and questions on the related Github repository: - [MQTT DataStreamer](https://github.com/PlotJuggler/plotjuggler-mqtt). - [Lab Streaming Layer DataStreamer](https://github.com/PlotJuggler/plotjuggler-lsl). - [ROS plugins](https://github.com/PlotJuggler/plotjuggler-ros-plugins). - [CAN .dbg DataLoader](https://github.com/PlotJuggler/plotjuggler-CAN-dbs). If you want a simple example to learn how to write your own plugins, have a look at [PlotJuggler/plotjuggler-sample-plugins](https://github.com/PlotJuggler/plotjuggler-sample-plugins) ## Installation ## Snap (recommended in Ubuntu, to ROS users too) The snap contains a version of PlotJuggler that can work with either ROS1 or ROS2. ![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg) To install it in Ubuntu 22.04, with ROS2 support, run: ``` sudo snap install plotjuggler ``` If you are still using ROS1 (Ubuntu 20.04), install instead: ``` sudo snap install plotjuggler-ros ``` ### Windows Binary installer This installer does __not__ include ROS plugins. **Windows Installer**: Check the [Release page](https://github.com/facontidavide/PlotJuggler/releases) to download the latest installer. ### Debian packages for ROS User Install the ROS packages with: ``` sudo apt install ros-$ROS_DISTRO-plotjuggler-ros ``` To launch PlotJuggler on ROS, use the command: ``` rosrun plotjuggler plotjuggler ``` or, if are using ROS2: ``` ros2 run plotjuggler plotjuggler ``` ROS plugins are available in a separate repository: https://github.com/PlotJuggler/plotjuggler-ros-plugins Please take a look at the instructions in that repository if you want to compile PJ and its ROS plugins from source. ## Compile from source You can find the detailed instructions here: [COMPILE.md](COMPILE.md). # Sponsorship and commercial support PlotJuggler required a lot of work to develop and maintain; my goal is to build the most intuitive and powerful tool to visualize data and timeseries. If you find PlotJuggler useful, consider donating [PayPal](https://www.paypal.me/facontidavide) or becoming a [Github Sponsor](https://github.com/sponsors/facontidavide). If you need to extend any of the functionalities of PlotJuggler to cover a specific need or to parse your custom data formats, you can receive commercial support from the main author, [Davide Faconti](mailto:[email protected]). # License PlotJuggler is released under the [Mozilla Public License Version 2.0](LICENSE.md), which allows users to develop closed-source plugins. Please note that some third-party dependencies (including Qt) use the **GNU Lesser General Public License**. # Star History [![Star History Chart](https://api.star-history.com/svg?repos=facontidavide/PlotJuggler&type=Date)](https://star-history.com/#facontidavide/PlotJuggler&Date) # Contributors <a href="https://github.com/facontidavide/plotjuggler/graphs/contributors"> <img src="https://contrib.rocks/image?repo=facontidavide/plotjuggler" /> </a> ", Assign "at most 3 tags" to the expected json: {"id":"4952","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"