1
0
Fork 0
mirror of https://github.com/gwm17/implot.git synced 2024-11-26 20:28:50 -05:00
implot/README.md

140 lines
8.4 KiB
Markdown
Raw Normal View History

2020-04-24 17:56:10 -04:00
# ImPlot
2020-09-06 18:24:16 -04:00
ImPlot is an immediate mode, GPU accelerated plotting library for [Dear ImGui](https://github.com/ocornut/imgui). It aims to provide a first-class API that ImGui fans will love. ImPlot is well suited for visualizing program data in real-time or creating interactive plots, and requires minimal code to integrate. Just like ImGui, it does not burden the end user with GUI state management, avoids STL containers and C++ headers, and has no external dependencies except for ImGui itself.
2020-04-24 17:56:10 -04:00
2020-09-06 20:42:08 -04:00
<img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/controls.gif" width="270"> <img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/filled.gif" width="270"> <img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/sin.gif" width="270">
2020-04-27 18:04:02 -04:00
2020-09-06 20:42:08 -04:00
<img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/query.gif" width="270"> <img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/bars.gif" width="270">
<img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/rt.gif" width="270">
2020-04-29 15:27:23 -04:00
2020-09-06 20:42:08 -04:00
<img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/stem.gif" width="270"> <img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/markers.gif" width="270">
<img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/shaded.gif" width="270">
2020-09-06 20:17:39 -04:00
2020-09-06 20:42:08 -04:00
<img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/candle.gif" width="270"> <img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/error.gif" width="270">
<img src="https://raw.githubusercontent.com/wiki/epezent/implot/screenshots3/tables.gif" width="270">
2020-05-31 17:37:04 -04:00
2020-04-25 10:02:51 -04:00
## Features
2020-04-24 17:56:10 -04:00
2020-09-06 18:24:16 -04:00
- GPU accelerated rendering
2020-08-16 16:38:51 -04:00
- multiple plot types:
2020-06-08 22:00:04 -04:00
- line plots
2020-06-14 09:49:56 -04:00
- shaded plots
2020-06-08 22:00:04 -04:00
- scatter plots
- vertical/horizontal bars graphs
2020-06-08 21:59:20 -04:00
- vertical/horizontal error bars
2020-09-02 12:01:25 -04:00
- stem plots
2020-05-03 01:46:20 -04:00
- pie charts
2020-06-08 22:00:04 -04:00
- heatmap charts
2020-06-02 23:30:25 -04:00
- and more likely to come
2020-04-25 10:02:51 -04:00
- mix/match multiple plot items on a single plot
2020-04-26 18:37:57 -04:00
- configurable axes ranges and scaling (linear/log)
2020-09-06 17:23:40 -04:00
- support for time formatted x-axes
2020-04-26 18:37:57 -04:00
- reversible and lockable axes
2020-05-11 02:10:57 -04:00
- support for up to three independent y-axes
2020-04-26 18:37:57 -04:00
- controls for zooming, panning, box selection, and auto-fitting data
2020-04-28 21:28:03 -04:00
- controls for creating persistent query ranges (see demo)
2020-06-15 22:18:07 -04:00
- remappable input controls
2020-04-25 10:02:51 -04:00
- several plot styling options: 10 marker types, adjustable marker sizes, line weights, outline colors, fill colors, etc.
2020-09-06 17:23:40 -04:00
- 10 built-in and user definable colormaps
2020-04-25 10:02:51 -04:00
- optional plot titles, axis labels, and grid labels
2020-04-26 18:37:57 -04:00
- optional legend with toggle buttons to quickly show/hide items
2020-08-16 16:38:51 -04:00
- default styling based on current ImGui theme, but most elements can be customized independently
- customizable data getters and data striding (just like ImGui:PlotLine)
2020-04-25 10:02:51 -04:00
- relatively good performance for high density plots
2020-05-29 14:04:16 -04:00
- support for single and double precision data
2020-09-06 17:23:40 -04:00
- and more! (see [Announcements](https://github.com/epezent/implot/issues/48))
2020-04-24 17:56:10 -04:00
2020-04-25 10:02:51 -04:00
## Usage
2020-08-16 16:38:51 -04:00
The API is used just like any other ImGui `BeginX`/`EndX` pair. First, start a new plot with `ImPlot::BeginPlot()`. Next, plot as many items as you want with the provided `PlotX` functions (e.g. `PlotLine()`, `PlotBars()`, `PlotErrorBars()`, etc). Finally, wrap things up with a call to `ImPlot::EndPlot()`. That's it!
2020-04-26 18:13:22 -04:00
2020-04-25 10:02:51 -04:00
```cpp
if (ImPlot::BeginPlot("My Plot")) {
2020-05-16 10:21:01 -04:00
ImPlot::PlotLine("My Line Plot", x_data, y_data, 1000);
ImPlot::PlotBars("My Bar Plot", values, 10);
2020-04-26 18:13:22 -04:00
...
ImPlot::EndPlot();
2020-04-25 10:02:51 -04:00
}
```
2020-08-16 16:38:51 -04:00
Consult `implot_demo.cpp` for a comprehensive example of ImPlot's features.
2020-04-26 18:37:57 -04:00
2020-09-06 18:24:16 -04:00
## Interactive Demo
An online version of the demo is hosted [here](https://traineq.org/implot_demo/src/implot_demo.html). You can view the plots and the source code that generated them. Note that this demo may not always be up to date and is not as performant as a desktop implementation, but it should give you a general taste of what's possible with ImPlot. Special thanks to [pthom](https://github.com/pthom) for creating and hosting this!
2020-04-26 18:37:57 -04:00
## Integration
2020-08-21 09:00:01 -04:00
1) Add `implot.h`, `implot_internal.h`, `implot.cpp`, `implot_items.cpp` and optionally `implot_demo.cpp` to your sources. Alternatively, you can get ImPlot using [vcpkg](https://github.com/microsoft/vcpkg/tree/master/ports/implot).
2020-08-16 16:43:41 -04:00
2) Create and destroy an `ImPlotContext` wherever you do so for your `ImGuiContext`:
2020-08-16 16:38:51 -04:00
```cpp
ImGui::CreateContext();
ImPlot::CreateContext();
...
ImPlot::DestroyContext();
ImGui::DestroyContext();
```
Of course, this assumes you already have an ImGui-ready environment. If not, consider trying [mahi-gui](https://github.com/mahilab/mahi-gui), which bundles ImGui, ImPlot, and several other packages for you.
2020-04-26 18:13:22 -04:00
2020-06-07 14:45:01 -04:00
## Special Notes
2020-08-16 16:38:51 -04:00
- If you experience data truncation and/or visual glitches, it is **HIGHLY** recommended that you EITHER:
2020-09-06 18:24:16 -04:00
1) Handle the `ImGuiBackendFlags_RendererHasVtxOffset` flag in your renderer when using 16-bit indices (the official OpenGL3 renderer supports this) and use an ImGui version with patch [imgui@f6120f8](https://github.com/ocornut/imgui/commit/f6120f8e16eefcdb37b63974e6915a3dd35414be), OR...
2020-06-07 14:45:01 -04:00
2) Enable 32-bit indices by uncommenting `#define ImDrawIdx unsigned int` in your `imconfig.h` file.
2020-09-06 18:29:28 -04:00
- By default, no anti-aliasing is done on line plots for performance reasons. If you use 4x MSAA, then you likely won't even notice. However, you can enable software AA per-plot with the `ImPlotFlags_AntiAliased` flag, or globally with `ImPlot::GetStyle().AntiAliasedLines = true;`.
2020-07-25 09:11:43 -04:00
2020-04-28 02:53:38 -04:00
## FAQ
**Q: Why?**
2020-05-03 01:37:48 -04:00
A: ImGui is an incredibly powerful tool for rapid prototyping and development, but provides only limited mechanisms for data visualization. Two dimensional plots are ubiquitous and useful to almost any application. Being able to visualize your data in real-time will give you insight and better understanding of your application.
2020-04-28 02:53:38 -04:00
2020-09-06 18:24:16 -04:00
**Q: Is ImPlot the right plotting library for me?**
2020-09-06 18:29:28 -04:00
A: If you're looking to generate publication quality plots and/or export plots to a file, ImPlot is NOT the library for you. ImPlot is geared toward plotting application data at realtime speeds with as little user code as possible. ImPlot does its best to create pretty plots (indeed there are quite a few styling options available), but it will always favor function over form.
2020-09-06 18:24:16 -04:00
2020-09-01 22:03:48 -04:00
**Q: Is ImPlot suitable for plotting large datasets?**
2020-04-28 02:53:38 -04:00
2020-09-06 18:24:16 -04:00
A: Yes, within reason. You can plot tens to hundreds of thousands of points without issue, but don't expect millions to be a buttery smooth experience. However, you can downsample extremely large datasets by telling ImPlot to stride your data at larger intervals if needed.
2020-04-28 02:53:38 -04:00
**Q: Can plot styles be modified?**
2020-09-06 18:24:16 -04:00
A: Yes. Plot colors, palettes, and various styling variables can be pushed/popped or modified permanently on startup. Three default styles are available, as well as an automatic style.
2020-04-28 02:53:38 -04:00
2020-09-06 18:24:16 -04:00
**Q: Does ImPlot support logarithmic scaling or time formatting?**
2020-04-28 02:53:38 -04:00
2020-09-06 18:24:16 -04:00
A: Yep! Both logscale and timescale are supported.
2020-04-28 02:53:38 -04:00
2020-05-11 02:10:57 -04:00
**Q: Does ImPlot support multiple y-axes? x-axes?**
2020-09-06 18:24:16 -04:00
A: Yes. Up to three y-axes can be enabled. Multiple x-axes are not supported.
2020-05-11 02:10:57 -04:00
2020-05-01 09:50:08 -04:00
**Q: Does ImPlot support [insert plot type]?**
2020-04-28 02:53:38 -04:00
2020-06-02 23:30:03 -04:00
A: Maybe. Check the demo, gallery, or [Announcements](https://github.com/epezent/implot/issues/48) to see if your desired plot type is shown. If not, consider submitting an issue or better yet, a PR!
2020-04-28 02:53:38 -04:00
**Q: Does ImPlot support 3D plots?**
A: No, and likely never will since ImGui only deals in 2D rendering.
2020-06-07 14:45:01 -04:00
**Q: My plot lines look like crap!**
A: See the note about anti-aliasing under **Special Notes** above.
2020-04-28 02:53:38 -04:00
**Q: Does ImPlot provide analytic tools?**
2020-08-16 16:38:51 -04:00
A: Not exactly, but it does give you the ability to query plot sub-ranges, with which you can process your data however you like.
2020-04-28 02:53:38 -04:00
**Q: Can plots be exported/saved to image?**
2020-09-06 18:29:28 -04:00
A: Not currently. Use your OS's screen capturing mechanisms if you need to capture a plot. ImPlot is not suitable for rendering publication quality plots; it is only intended to be used as a visualization tool. Post-process your data with MATLAB or matplotlib for these purposes.
2020-04-28 02:53:38 -04:00
2020-05-29 14:03:20 -04:00
**Q: Does ImPlot handle double precision data?**
A: Yes, ImPlot accepts both `float` and `double` for all of its plotting functions.
2020-04-29 09:13:23 -04:00
**Q: Can ImPlot be used with other languages/bindings?**
2020-04-28 22:43:01 -04:00
2020-08-17 21:52:49 -04:00
A: Yes, you can use the C binding, [cimplot](https://github.com/cimgui/cimplot) with most high level languages. [DearPyGui](https://github.com/hoffstadt/DearPyGui) provides a Python wrapper, among other things. A Rust binding, [implot-rs](https://github.com/4bb4/implot-rs), is currently in the works. An example using Emscripten can be found [here](https://github.com/pthom/implot_demo).