{"id":19384177,"url":"https://github.com/windelbouwman/lognplot","last_synced_at":"2025-04-23T21:32:09.020Z","repository":{"id":38334408,"uuid":"207801903","full_name":"windelbouwman/lognplot","owner":"windelbouwman","description":"Plotting and logging of real-time data for desktop.","archived":false,"fork":false,"pushed_at":"2022-06-06T19:23:55.000Z","size":961,"stargazers_count":83,"open_issues_count":24,"forks_count":11,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-02T20:22:35.374Z","etag":null,"topics":["cairo","gtk-rs","gui","plotting","pyqt5","python","rust","timeseries","tracing","visualization"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/windelbouwman.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-09-11T12:01:29.000Z","updated_at":"2025-03-25T22:45:57.000Z","dependencies_parsed_at":"2022-07-25T20:30:59.499Z","dependency_job_id":null,"html_url":"https://github.com/windelbouwman/lognplot","commit_stats":null,"previous_names":["windelbouwman/quartz"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windelbouwman%2Flognplot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windelbouwman%2Flognplot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windelbouwman%2Flognplot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windelbouwman%2Flognplot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/windelbouwman","download_url":"https://codeload.github.com/windelbouwman/lognplot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250518029,"owners_count":21443883,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cairo","gtk-rs","gui","plotting","pyqt5","python","rust","timeseries","tracing","visualization"],"created_at":"2024-11-10T09:29:24.506Z","updated_at":"2025-04-23T21:32:07.281Z","avatar_url":"https://github.com/windelbouwman.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n[![Build Status](https://travis-ci.org/windelbouwman/lognplot.svg?branch=master)](https://travis-ci.org/windelbouwman/lognplot)\n[![dependency status](https://deps.rs/repo/github/windelbouwman/lognplot/status.svg)](https://deps.rs/repo/github/windelbouwman/lognplot)\n[![Documentation Status](https://readthedocs.org/projects/lognplot/badge/?version=latest)](https://lognplot.readthedocs.io)\n[![docs.rs Documentation](https://docs.rs/lognplot/badge.svg)](https://docs.rs/lognplot)\n[![crates.io page](https://img.shields.io/crates/v/lognplot.svg)](https://crates.io/crates/lognplot)\n[![PyPI](https://img.shields.io/pypi/v/lognplot)](https://pypi.org/project/lognplot)\n[![matrix](https://img.shields.io/matrix/lognplot:matrix.org)](https://matrix.to/#/#lognplot:matrix.org)\n![.github/workflows/ci.yml](https://github.com/windelbouwman/lognplot/workflows/.github/workflows/ci.yml/badge.svg)\n\n![logo](logo/logo.png)\n\nLive timeseries analysis on your desktop!\n\n# About\n\nLognplot is a graphical viewer for time series data. Unlike many other\nprojects in this area, lognplot is not a hosted web application.\nIt is a desktop application which visualizes your data from your\napplication. This can be an embedded, robotic, mobile, PC or PLC application.\n\nFeatures:\n- Plot data live while staying responsive\n- Send data over TCP/IP link to GUI.\n- Two GUI implementations:\n    - python GUI implementation (based on PyQt5)\n    - rust GUI implementation (based on gtk-rs / cairo)\n- Client libraries for:\n    - Python\n    - [C](demo/c/README.md)\n    - [C++](cpp/README.md)\n    - [C#](dotnet/README.md)\n    - Rust\n- Export data to HDF5\n- [Data adapters](adapters/README.md) for:\n    - ADS\n    - MQTT\n    - ROS2\n\n# Video\n\nThese are recorded videos of the tool:\n\n- [lognplot @ FOSDEM 2020](https://fosdem.org/2020/schedule/event/ema_lognplot/)\n\n# Screenshots\n\nThis is an example screenshot of the lognplot python application, visualizing\n10 million datapoints. Note that zooming is still smoothly performed.\n\n![screenshot3](screenshots/screenshot3.png)\n\nThis is an example screenshot of the GTK gui implemented with rust, visualizing also 10 million\ndatapoints.\n\n![screenshot4](screenshots/screenshot4.png)\n\nThis is an example of the plot window, when zoomed out.\nNote that not all points are displayed, but aggregates\nof the data are visualized as min/max/mean/stddev lines.\n\n![screenshot1](screenshots/screenshot1.png)\n\nWhen zooming into the data, the individual data points come\ninto picture.\n\n![screenshot2](screenshots/screenshot2.png)\n\n# Installation\n\nNote that at this moment, you will want to grab the latest\ngit version from github.\n\nFirst clone this repository:\n\n    $ git clone https://github.com/windelbouwman/lognplot.git\n\nFor python, follow this steps:\n\n    $ cd lognplot/python\n    $ pip install .\n    $ python -m lognplot\n\nFor rust, follow these steps:\n\n    $ cd lognplotgtk\n    $ cargo run --release\n\nPackages are released for rust and python\n\nRust crate: https://crates.io/crates/lognplot\n\nPython package: https://pypi.org/project/lognplot/\n\n## Requirements\n\nFor the GTK variant of the tool, you need the following to be installed:\n\n- cairo-gobject-devel\n- pango-devel\n- atk-devel\n- gdk-pixbuf2-devel\n- gtk3-devel\n- hdf5-devel\n\n# Usage\n\nTo use the python side of this code, start as a demo the softscope:\n\n    $ cd python\n    $ python softscope.py\n\nThis will popup a plot window. Zooming and panning can be done with the keyboard\nkeys w,a,s,d and i,j,k,l. Press space or enter to autofit. The data is\na 10 kHz generated signal.\n\nAnother demo is the softscope server. This will open a TCP/IP port\nwhich can receive data.\n\n    $ cd python\n    $ python -m lognplot\n\nThe softscope is now\nready to receive streaming data via network.\n\nNext, start the demo datasource, which will send data via TCP to this GUI:\n\n    $ cd demo\n    $ python noize_source.py\n\nAnother server demo is the rust side of the code. Start the GUI like this:\n\n    $ cd lognplotgtk\n    $ cargo run\n\nThis application will be able to receive data via TCP/IP.\n\n# Send data from C code\n\nTo send data from C-code, refer to the demo in `demo/c`. This demo uses\nthe clognplot rust crate, which is a static library which can be used from C.\nThe resulting C program will connect over TCP/IP and send its data to the plot\ntool using parts of the rust crates.\n\n# Export data to HDF5\n\nTo be able to further process the data in, for example, a python script, you\ncan use File-\u003eSave to save all captured data as a HDF5 file.\n\nExample usage of this saved HDF5 file:\n\n```python\n\nimport h5py\nfrom matplotlib import pyplot as plt\n\nf = h5py.File('datorz.h5', 'r')\ngroup = f['my_datorz']\nsignal = group['My_signal']\nplt.plot(signal[:,0], signal[:,1])\nplt.show()\n\n```\n\n# Documentation\n\nDocumentation for python users can be found here: https://lognplot.readthedocs.io/en/latest/\nDocumentation for rust users can be found here: https://docs.rs/lognplot\n\n# Plan\n\nThis is a list of things to do:\n\n- PyQt5 implementation\n- gtk-rs implementation\n\n# Requirements for live data visualization\n\n- Append data structure to enable appending new data\n- Data point aggregation for zooming out and showing min/max/mean lines\n\n# Similar projects\n\nThere is an interesting list of similar projects. Do you know of another\nproject? Please submit a pull request or an issue!\n\n- [Embedded debugger](https://github.com/DEMCON/EmbeddedDebugger)\n- [getcurve.io](https://getcurve.io/)\n- [grafana](https://grafana.com/)\n    - Web based\n- [KST plot](https://kst-plot.kde.org/)\n    - Can view large CSV files\n- [plot juggler](https://github.com/facontidavide/PlotJuggler)\n    - Qt interface\n    - Interfaces with ROS\n- [Plc-Lab](http://plc-lab.nl/)\n    - Fancy GUI\n- [RQT](https://wiki.ros.org/rqt)\n    - Comes with ROS\n- [sigrok](https://sigrok.org)\n    - Slick Qt interface\n    - Interfacing with many logic analyzers and oscilloscopes\n- [speedscope](https://www.speedscope.app/)\n    - Callstack tracer\n- [trace compass](https://www.eclipse.org/tracecompass/)\n    - Eclipse based\n    - Supports many trace formats\n- [tracy profiler](https://bitbucket.org/wolfpld/tracy)\n\n\n# Profiling\n\nTo optimize the GUI experience, you can profile the rust\nlognplot gui by the following method.\n\nModify the `Cargo.toml` file to include this snippet:\n\n```toml\n[profile.release]\ndebug = true\n```\n\nThis will build in release mode, but include debug symbols.\n\nNow, build in release mode:\n\n    $ cargo build --release\n\nNext up, use the linux perf tool to profile the application:\n\n    $ perf record -F 99 --call-graph dwarf target/release/lognplotgtk\n\nNow perform some intensive work. When done, close the gui.\n\nAnalyze the perf results:\n\n    $ perf report\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwindelbouwman%2Flognplot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwindelbouwman%2Flognplot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwindelbouwman%2Flognplot/lists"}