1
0
Fork 0
mirror of https://github.com/gwm17/implot.git synced 2025-04-22 08:18:50 -04:00

Compare commits

...

75 Commits

Author SHA1 Message Date
omar 18758e237e
Avoid fetching GImPlot multiple times when possible. (#468)
In the case this is a thread_local variable it is best to avoid fetching too many times.
Either way local caching tends to be beneficial as a non-local variable would often be fetched multiple times.
2023-04-19 18:35:30 +02:00
Minty-Meeo fb084f3719
Use 'nullptr' instead of 'NULL' (#465) 2023-04-17 15:21:32 +02:00
omar 33c5a965f5
Fixes for requirement to define IMGUI_DEFINE_MATH_OPERATORS before imgui.h (or at least at imconfig) (#449) 2023-02-15 19:53:25 -06:00
Evan Pezent d875123534 make PlotText honor ImPlotItemFlags_NoFit 2022-11-25 09:31:58 -06:00
Joshua Minor fcb51d2c9c
Use snprintf instead of sprintf in implot_demo.cpp (#426)
* Use snprintf instead of sprintf in implot_demo.cpp

* Enlarged text buffer

Co-authored-by: BenBE <BenBE@geshi.org>

Co-authored-by: BenBE <BenBE@geshi.org>
2022-11-25 09:21:45 -06:00
omar 626e391670
Fixes for ImGuiModFlags_XXX -> ImGuiMod_XXX (v1.89) (#347) (#407)
Sorry!
2022-09-29 13:00:23 -05:00
omar 8879c99aef
Fix for allowing core imgui to use typed ImGuiCol / ImGuiStyleVar enums. (#405) 2022-09-23 19:30:19 -05:00
Evan Pezent 6978a3e177
Update README.md 2022-09-17 15:25:29 -05:00
Evan Pezent 15e494b76a Merge branch 'master' of https://github.com/epezent/implot 2022-09-17 15:02:47 -05:00
Evan Pezent f88ad32a47 remove mention of IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES in implot_items.cpp 2022-09-17 15:02:34 -05:00
Evan Pezent 3e13c95986
Add ImPlotLegendFlags_Sort (#404)
* add ImPlotLegendFlags_Sort

* replace qsort_s with qsort
2022-09-17 14:23:26 -05:00
Evan Pezent 4ba42f200a address a few static analysis warnings 2022-09-17 13:17:07 -05:00
Evan Pezent 57149164d5 Fix clamp in SetupAxisTicks 2022-09-17 10:25:30 -05:00
Evan Pezent 9ef3a97966 Merge branch 'master' of https://github.com/epezent/implot 2022-09-17 10:20:33 -05:00
Evan Pezent 921a81f307 Replace assert with clamp in SetupAxisTicks 2022-09-17 10:20:20 -05:00
Mengna Li 8c06ff0252
Add vcpkg installation instructions (#401)
* Add vcpkg installation instructions

* update
2022-09-15 07:00:13 -05:00
Pascal Thomet 98c76edbb4
Remove support for IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES (#402) 2022-09-14 09:41:10 -05:00
Pascal Thomet f719a180ff
Support custom numeric types (#399)
* implot_items.cpp: support types customization

You can customize the supported types in two ways:
  1. Define IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES at compile time to add support for all known types.
  2. Or, define IMPLOT_CUSTOM_NUMERIC_TYPES at compile time to define your own type list. As an example, you could use the compile time define given by the line below in order to support only float and double.
        -DIMPLOT_CUSTOM_NUMERIC_TYPES="(float)(double)"

Details:

- `CALL_INSTANTIATE_FOR_NUMERIC_TYPES` will duplicate the template instantion code `INSTANTIATE_MACRO(T)` on supported types. It uses a trick to be able to loop on the type list `IMPLOT_NUMERIC_TYPES`

- `INSTANTIATE_MACRO` needs to be defined, then undefined before and after each template instantiation

* CI: link example app, with null backend

Github's CI will now compile ImGui, compile ImPlot, link and run an example application (with no backend).
It serves as a proof that an app can be built, linked, and run, with type customization.

- .github/example_implot.cpp is an example app built with Dear ImGui and ImPlot
  This app uses implot and imgui, but does not output to any backend!
  If `IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES` is active, it will test that `long double` is supported.

- Corrected arch matrix options:
     32 bits or 64 bits for win and linux
     x86_64 or arm64 for mac (32 bits is deprecated on macs, and will not link with recent XCode)

- Added `IMPLOT_NUMERIC_SETIMPLOT_NUMERIC_SET` as a switch to CMakeList
  This switch is currently not used in CI, but can be used during development.
  It could be later be used in the matrix options, at the cost of increasing the number of build
   per workflow.

Note: support for MingW 32 bits was commented out. MingW on Github CI does not fully support 32 bits: link fails when it tries to link 64 bits system libraries. As a result, the windows matrix was spearated into Windows_MSVC and Windows_MingW
2022-09-13 20:39:29 -05:00
Pascal Thomet 49db527db1
Support long & long double, add macro INSTANTIATE_FOR_NUMERIC_TYPES (Fix #319) (#397)
* implot_items: INSTANTIATE_FOR_NUMERIC_TYPES / add long & long double (Fix #319)

- INSTANTIATE_FOR_NUMERIC_TYPES is a macro which instantiates templated plotting functions for numeric types.
This macro helps reduce some boilerplate code for template functions instantiations.

- Added optional support for more numeric types (long and long double)
The numeric type list does not include "long", "unsigned long" and "long double".
Most of the time, it is not an issue when linking statically.
However, when linking dynamically, issues related to undefined functions can arise:
although those types might have the same size, they are considered separate.

define IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES) in order to define versions for those types

In this case, the compilation time for this specific file will be 33% longer

- implot_internal.h / ImMean and ImStdDev: added cast  to double
(suppress MSVC warning about downcasting)

- Notes about numeric types "synonyms":
  Even if "long double" and "double" might occupy the same size,
they are not complete synonyms, and it is legal to define overloads for both double and long double.
  On some platforms, "unsigned long" might be the same size as "unsigned long long",
but it is nonetheless a separate type: see https://godbolt.org/z/1KWv5re7q (example with GCC 64 bits)
  On some other platforms, "long double" might be the same size as "double", but it is nonetheless a separate type: see https://godbolt.org/z/ae71P7rqG (example with MSVC 64 bits)

* IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES: disabled by default

* uppercase template instantiatation macros & group them

* implot_items.cpp: reword comments on IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES

* README.md: mention compile-time option IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES

* Github CI: IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES=1
2022-09-11 09:43:27 -05:00
Rokas Kupstys fd16fe001c
CI setup (#395)
* Fix truncation warnings.

* CI: GitHub Actions CI setup.
2022-09-06 18:28:32 -05:00
Rokas Kupstys 002ffc95bc
Fix truncation warnings. (#392) 2022-09-06 18:17:09 -05:00
ozlb e80e42e8b4
ImPlotTimeFmt_MinSMs (#383) 2022-07-29 07:57:51 -05:00
ozlb 220f5c9ab4
Annotation Label y axis fix (#384) 2022-07-28 22:41:21 -05:00
Evan Pezent 7a470b2e17 add ImPlotAxisFlags_NoSideSwitch and ImPlotAxisFlags_NoHighlight 2022-07-07 20:27:24 -05:00
Evan Pezent f33a5990d7 Merge branch 'master' of https://github.com/epezent/implot 2022-07-07 19:04:24 -05:00
Evan Pezent 1fed5c2c19 temp fix for time formatted mouse position text 2022-07-07 19:04:16 -05:00
K b4aec718a5
fix merge typo in Locator_Time() (#380) 2022-07-07 18:31:05 -05:00
Evan Pezent 8c53333489 fix PlotDigital/Dummy flags 2022-07-04 19:30:36 -05:00
Evan Pezent fc0fd11246 ImPlotLineFlags_Shaded and ImPlotStairsFlags_Shaded 2022-06-22 11:00:42 -05:00
Evan Pezent 6c00109636 make ColormapScale reversable 2022-06-20 07:48:51 -05:00
Evan Pezent 0f4d4dccc3 add ImPlotColormapScaleFlags 2022-06-19 22:51:51 -05:00
Evan Pezent 6f4986b14f add ColormapSlider to demo 2022-06-19 21:14:36 -05:00
Evan Pezent dbb461db24 update README 2022-06-18 23:16:01 -05:00
Evan Pezent 63d5ed94b7
Features/item flags (#319)
* add PlotBarGroups and layout some plans for flags

* exprimentin

* item flags added to each plotter

* rendering templates

* rendering templates

* item flags and axis scales

* item flags

* template markers

* markers

* benching

* buffer

* inline adjust

* inline fix

* dunno

* fix some todos

* tickers

* clean up

* update TODO

* update breaking changes

* demo cleanup

* remove TODO label

* header cleanup
2022-06-18 22:59:32 -05:00
Rokas Kupstys 79b05d5e25
Fix freed memory read error in AddTicksTime(). Invalid read occurred when LabelTickTime() resizes ticks.TextBuffer while last_major held pointer pointing into old now freed buffer. (#365)
Fixed a warning about condition depending on uninitialized ImPlotLegend::PreviousLocation.
2022-06-17 09:09:25 -05:00
rjasiak54 b9c0a39b08
in README.md 'Demos' section, changed 'imgui_demo.h' to imgui_demo.cpp' (#369) 2022-06-17 09:06:38 -05:00
Evan Pezent 3dd7e75c7d gaurd IMPLOT_DISABLE_OBSOLETE_FUNCTIONS in implot_demo.cpp 2022-05-08 10:40:27 -05:00
Evan Pezent 947c2c02e4 gaurd IMPLOT_DISABLE_OBSOLETE_FUNCTIONS in implot_demo.cpp 2022-05-08 10:40:16 -05:00
Evan Pezent 32a4617cd6 fix legend icons and drag tools with ImGui::KeepAliveID 2022-05-08 10:23:42 -05:00
Max Schwarz 196a0243c5
ImPlotAxis::WillRender(): return false if axis is disabled (#350)
This saves a few CPU cycles in SetupFinish(), which otherwise formats
tick labels & spacing for disabled axes.
2022-04-20 20:19:39 -07:00
omar df4256c9e8
Demo: tweak for runtime speed. (#353) 2022-04-20 20:19:01 -07:00
omar 1160243218
Fix for 1.88 WIP (18716) renaming ImGuiKeyModFlags to ImGuiModFlags (#347) 2022-04-05 06:58:12 -07:00
Evan Pezent b47c8bacdb Merge branch 'master' of https://github.com/epezent/implot 2022-01-30 17:07:12 -08:00
Evan Pezent 58240e5311 remove redefinition of GetInputMap 2022-01-30 17:07:05 -08:00
Evan Pezent 9b4ba149ec
Update README.md 2022-01-30 10:47:33 -08:00
Evan Pezent f438a21813 fix comment find/replace accident 2022-01-30 10:26:21 -08:00
Evan Pezent 86f4dd6e5c use ImFormatString instead of sprintf/snprintf 2022-01-30 10:19:29 -08:00
Evan Pezent adfc96810e remove unecessary msvc warning disables 2022-01-30 10:08:55 -08:00
Evan Pezent 8d3bd31395 -Wformat-nonliteral 2022-01-30 10:06:39 -08:00
Evan Pezent 168244e422 replace sprintf with snprintf 2022-01-30 09:54:49 -08:00
Evan Pezent 3a53f0b796 init PixelMin/Max 2022-01-30 09:35:49 -08:00
Evan Pezent 199b4803b6 Merge branch 'sergeyn-pr_branch' 2022-01-30 09:32:07 -08:00
Sergey Nenakhov 6659b164fe intel compiler warning fixes (and fastmath in general) 2022-01-23 00:50:18 +01:00
Evan Pezent 4fcc6e01ac fix sizeof(T) in IndexData 2021-12-02 20:54:54 -08:00
Evan Pezent c0da6fea04 add PlotBarGroups 2021-10-24 00:25:46 -07:00
Evan Pezent 6ee1559715
Setup API (#294)
* add new padding algo

* opposite working for y and x

* remove name axis colors

* move title label rendering

* axis dev

* clean up

* pre formatter

* formatter

* changing over to multi x axes

* more multi x changes

* more multi x changes

* more multi x changes

* setup 75% there

* 85% there

* 85% there

* remove query

* update input handling

* input and dnd tweaking

* input testing

* update demo

* setup debug

* setup debug

* bug fixes

* bug fixes

* more debug

* input

* more setup

* setup api almost complete

* setup api almost complete

* more clean up

* cleanup

* final commit before merge
2021-10-19 20:01:06 -07:00
Evan Pezent dea3387cdc buffer overflow fix 2021-09-07 21:46:54 -07:00
Evan Pezent c40206f2ea spaces 2021-09-07 20:24:34 -07:00
Evan Pezent f1b86b9fe4 Merge branch 'master' of https://github.com/epezent/implot 2021-09-07 20:23:59 -07:00
Evan Pezent 5ed9e78676 add #include <immintrin.h> fallback 2021-09-07 20:20:12 -07:00
Dario Mambro 14d4c96d0c
more flexible custom context management (#281) 2021-08-28 07:00:47 -07:00
sergeyn 0fb3346a7a
custom context management (same way as in ImGui) (#278) 2021-08-24 08:08:00 -07:00
Evan Pezent 3e96fd7c02
improve indexing, line rendering performance by 45% (#270)
* add IndexData and Indexers

* simplify transformers

* 30% improvement

* moving around

* add TODO.md

* fix bar plot aliasing

* finishup indexing

* remove debug bools
2021-07-30 20:27:02 -07:00
Evan Pezent c8601ac0d5 rev version, fix unused lines 2021-07-29 19:14:13 -07:00
Jeslas Pravin 864ebb90b6
fix: PlotShaded Opposite triangle winding (#269) 2021-07-29 19:09:01 -07:00
Evan Pezent 4be83def59 add IsSubplotsHovered 2021-07-28 11:52:57 -07:00
Evan Pezent 507459fd5f move axis equal constraint after pixel determination 2021-07-23 16:32:57 -07:00
Evan Pezent 2dc2a4cfd5 improve tick label culling 2021-07-15 20:40:51 -07:00
Evan Pezent 83cb14b54a fix offsetandstride args...oops 2021-07-09 20:29:04 -07:00
Evan Pezent cd4704fd52 revert OffsetAndStride 2021-07-09 20:23:12 -07:00
Evan Pezent bffd448207 revert OffsetAndStride 2021-07-09 20:22:21 -07:00
Evan Pezent 51930a5ae6 fix imgui backward compat, YAxis[3], and add new demo benchmark option for LineG 2021-07-09 17:39:12 -07:00
Evan Pezent 5ab78cbc7d version string 2021-07-08 08:21:56 -07:00
Evan Pezent eb40cc908d Merge branch 'master' of https://github.com/epezent/implot 2021-07-07 22:18:51 -07:00
Evan Pezent 389781c31c v0.11 WIP 2021-07-07 22:18:38 -07:00
10 changed files with 7335 additions and 4882 deletions

95
.github/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,95 @@
# This build script is not meant for general use, it is for CI use only!
cmake_minimum_required(VERSION 3.0)
project(implot)
#
# Global options
#
# Same as Dear ImGui
set(CMAKE_CXX_STANDARD 11)
# Arch option for linux
if (NOT APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU" AND DEFINED GCC_ARCH)
if ("${GCC_ARCH}" MATCHES "Win32|x86|32")
add_compile_options(-m32)
add_link_options(-m32)
elseif ("${GCC_ARCH}" MATCHES "Win64|x64|64")
add_compile_options(-m64)
add_link_options(-m64)
endif ()
endif ()
# Arch option for Mac: arm64 for M1 or x86_64 for intel (32 bits build are deprecated on Mac)
if(APPLE AND DEFINED OSX_ARCH)
if ("${OSX_ARCH}" MATCHES "x86_64")
set(CMAKE_OSX_ARCHITECTURES "x86_64")
elseif ("${OSX_ARCH}" MATCHES "arm64")
set(CMAKE_OSX_ARCHITECTURES "arm64")
else()
message(FATAL_ERROR "Unhandled OSX_ARCH=${OSX_ARCH}")
endif()
endif()
#
# Dear ImGui library with no backend
#
set(imgui_sources
../imgui/imconfig.h
../imgui/imgui.cpp
../imgui/imgui.h
../imgui/imgui_demo.cpp
../imgui/imgui_draw.cpp
../imgui/imgui_internal.h
../imgui/imgui_tables.cpp
../imgui/imgui_widgets.cpp
../imgui/imstb_rectpack.h
../imgui/imstb_textedit.h
../imgui/imstb_truetype.h
)
add_library(imgui ${imgui_sources})
target_include_directories(imgui PUBLIC ../imgui)
#
# ImPlot library
#
file(GLOB SOURCE_CODE ../implot*.*)
add_library(implot STATIC ${SOURCE_CODE})
if(MSVC)
target_compile_options(implot PRIVATE /W4 /WX)
else()
target_compile_options(implot PRIVATE -Wall -Werror -pedantic)
endif()
target_include_directories(implot PUBLIC ${CMAKE_CURRENT_LIST_DIR}/..)
target_link_libraries(implot PUBLIC imgui)
if (UNIX)
target_link_libraries(implot PUBLIC m stdc++)
endif()
# Define supported types via command line:
# - With no choice all types are supported (so that the CI provides support for all known types)
# - with -DIMPLOT_CUSTOM_NUMERIC_TYPES="default" the default set defined in implot_items.cpp is used
# - with -DIMPLOT_CUSTOM_NUMERIC_TYPES="(int)(float)(double)" only int, float and double are supported
if (NOT DEFINED IMPLOT_CUSTOM_NUMERIC_TYPES)
set(IMPLOT_CUSTOM_NUMERIC_TYPES "all")
endif()
if ("${IMPLOT_CUSTOM_NUMERIC_TYPES}" STREQUAL "default")
message("==== Compiling for default types ====")
elseif("${IMPLOT_CUSTOM_NUMERIC_TYPES}" STREQUAL "all")
message("==== Compiling for all types ====")
target_compile_definitions(implot PRIVATE "IMPLOT_CUSTOM_NUMERIC_TYPES=(signed char)(unsigned char)(signed short)(unsigned short)(signed int)(unsigned int)(signed long)(unsigned long)(signed long long)(unsigned long long)(float)(double)(long double)")
else()
message("==== Compiling for custom types: ${IMPLOT_CUSTOM_NUMERIC_TYPES} ====")
target_compile_definitions(implot PRIVATE "IMPLOT_CUSTOM_NUMERIC_TYPES=${IMPLOT_CUSTOM_NUMERIC_TYPES}")
endif()
#
# implot example binary application (with no backend)
#
add_executable(example_implot example_implot.cpp)
target_link_libraries(example_implot PRIVATE implot)

55
.github/example_implot.cpp vendored Normal file
View File

@ -0,0 +1,55 @@
// Sample app built with Dear ImGui and ImPlot
// This app uses implot and imgui, but does not output to any backend! It only serves as a proof that an app can be built, linked, and run.
#include "imgui.h"
#include "implot.h"
#include "stdio.h"
int main(int, char**)
{
printf("sample_implot: start\n");
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImPlot::CreateContext();
// Additional imgui initialization needed when no backend is present
ImGui::GetIO().DisplaySize = ImVec2(400.f, 400.f);
ImGui::GetIO().Fonts->Build();
// Render 500 frames
for(int counter = 0; counter < 500; ++counter)
{
ImGui::NewFrame();
if (ImGui::Begin("Hello, world!"))
{
ImGui::Text("Hello again");
if (ImPlot::BeginPlot("My Plot"))
{
static double values[] = {1., 3., 5.};
ImPlot::PlotLine("Values", values, 3);
ImPlot::EndPlot();
}
#ifdef IMPLOT_INSTANTIATE_ALL_NUMERIC_TYPES
if (ImPlot::BeginPlot("My Plot (long double)"))
{
static long double values[] = {1., 3., 5.};
ImPlot::PlotLine("Values", values, 3);
ImPlot::EndPlot();
}
#endif
ImGui::End();
}
ImGui::Render();
}
ImPlot::DestroyContext();
ImGui::DestroyContext();
printf("sample_implot: end\n");
return 0;
}

144
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,144 @@
name: build
on:
push:
pull_request:
jobs:
Linux:
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
build_type:
- debug
- release
compiler:
- gcc
- clang
arch:
- x86
- x64
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v3
with:
repository: ocornut/imgui
path: imgui
- name: Dependencies
run: sudo apt-get install g++-multilib
- name: Configure
run: cmake -DCMAKE_CXX_COMPILER=${{ matrix.compiler }} -DCMAKE_C_COMPILER=${{ matrix.compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DGCC_ARCH=${{ matrix.arch }} -B cmake-build -S .github
- name: Build
run: cmake --build cmake-build --parallel $(nproc)
- name: Run
run: |
file cmake-build/example_implot
cmake-build/example_implot
MacOS:
runs-on: macos-11
strategy:
fail-fast: false
matrix:
build_type:
- debug
- release
arch:
- x86_64
- arm64
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v3
with:
repository: ocornut/imgui
path: imgui
- name: Configure
shell: bash
run: cmake -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DOSX_ARCH=${{ matrix.arch }} -B cmake-build -S .github
- name: Build
shell: bash
run: cmake --build cmake-build --parallel $(sysctl -n hw.ncpu)
- name: Run
if: matrix.arch == 'x86_64' # github's CI hosts seem to be running intel and can not run ARM
run: |
file cmake-build/example_implot
cmake-build/example_implot
Windows_MSVC:
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
build_type:
- debug
- release
arch:
- Win32
- x64
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v3
with:
repository: ocornut/imgui
path: imgui
- name: Configure
shell: bash
run: cmake -G 'Visual Studio 17 2022' -A ${{ matrix.arch }} -B cmake-build -S .github
- name: Build
shell: bash
run: cmake --build cmake-build -- -p:Configuration=${{ matrix.build_type }} -maxcpucount:$NUMBER_OF_PROCESSORS
- name: Run
run: .\cmake-build\${{matrix.build_type}}\example_implot.exe
Windows_MingW: # MingW on Github CI does not fully support 32 bits: link fails when it tries to link 64 bits system libraries.
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
build_type:
- debug
- release
arch:
- x64
# - Win32
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v3
with:
repository: ocornut/imgui
path: imgui
- name: Configure
shell: bash
run: cmake -G 'MinGW Makefiles' -DGCC_ARCH=${{ matrix.arch }} -B cmake-build -S .github
- name: Build
shell: bash
run: cmake --build cmake-build --parallel $NUMBER_OF_PROCESSORS
- name: Run (MingW)
run: .\cmake-build\example_implot.exe

View File

@ -19,7 +19,7 @@ ImPlot is an immediate mode, GPU accelerated plotting library for [Dear ImGui](h
- line plots - line plots
- shaded plots - shaded plots
- scatter plots - scatter plots
- vertical/horizontal bars graphs - vertical/horizontal/stacked bars graphs
- vertical/horizontal error bars - vertical/horizontal error bars
- stem plots - stem plots
- stair plots - stair plots
@ -33,7 +33,7 @@ ImPlot is an immediate mode, GPU accelerated plotting library for [Dear ImGui](h
- subplots - subplots
- time formatted x-axes (US formatted or ISO 8601) - time formatted x-axes (US formatted or ISO 8601)
- reversible and lockable axes - reversible and lockable axes
- up to three independent y-axes - multiple x-axes and y-axes
- controls for zooming, panning, box selection, and auto-fitting data - controls for zooming, panning, box selection, and auto-fitting data
- controls for creating persistent query ranges (see demo) - controls for creating persistent query ranges (see demo)
- several plot styling options: 10 marker types, adjustable marker sizes, line weights, outline colors, fill colors, etc. - several plot styling options: 10 marker types, adjustable marker sizes, line weights, outline colors, fill colors, etc.
@ -43,7 +43,7 @@ ImPlot is an immediate mode, GPU accelerated plotting library for [Dear ImGui](h
- default styling based on current ImGui theme, or completely custom plot styles - default styling based on current ImGui theme, or completely custom plot styles
- customizable data getters and data striding (just like ImGui:PlotLine) - customizable data getters and data striding (just like ImGui:PlotLine)
- accepts data as float, double, and 8, 16, 32, and 64-bit signed/unsigned integral types - accepts data as float, double, and 8, 16, 32, and 64-bit signed/unsigned integral types
- and more! (see Announcements [2020](https://github.com/epezent/implot/issues/48)/[2021](https://github.com/epezent/implot/issues/168)) - and more! (see Announcements [2022](https://github.com/epezent/implot/discussions/370)/[2021](https://github.com/epezent/implot/issues/168)/[2020](https://github.com/epezent/implot/issues/48))
## Usage ## Usage
@ -71,7 +71,7 @@ Of course, there's much more you can do with ImPlot...
## Demos ## Demos
A comprehensive example of ImPlot's features can be found in `implot_demo.h`. Add this file to your sources and call `ImPlot::ShowDemoWindow()` somewhere in your update loop. You are encouraged to use this file as a reference when needing to implement various plot types. The demo is always updated to show new plot types and features as they are added, so check back with each release! A comprehensive example of ImPlot's features can be found in `implot_demo.cpp`. Add this file to your sources and call `ImPlot::ShowDemoWindow()` somewhere in your update loop. You are encouraged to use this file as a reference when needing to implement various plot types. The demo is always updated to show new plot types and features as they are added, so check back with each release!
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! 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!
@ -93,7 +93,19 @@ ImGui::DestroyContext();
You should be good to go! You should be good to go!
If you want to test ImPlot quickly, consider trying [mahi-gui](https://github.com/mahilab/mahi-gui), which bundles ImGui, ImPlot, and several other packages for you. ## Installing ImPlot using vcpkg
You can download and install ImPlot using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
```bash
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install implot
```
The ImPlot port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
## Extremely Important Note ## Extremely Important Note
@ -110,20 +122,20 @@ A: ImGui is an incredibly powerful tool for rapid prototyping and development, b
**Q: Is ImPlot the right plotting library for me?** **Q: Is ImPlot the right plotting library for me?**
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. 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. 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 high levels of interactivity. 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.
**Q: Where is the documentation?** **Q: Where is the documentation?**
A: The API is thoroughly commented in `implot.h`, and the demo in `implot_demo.cpp` should be more than enough to get you started. A: The API is thoroughly commented in `implot.h`, and the demo in `implot_demo.cpp` should be more than enough to get you started. Also take a look at the [implot_demos](https://github.com/epezent/implot_demos) repository.
**Q: Is ImPlot suitable for plotting large datasets?** **Q: Is ImPlot suitable for plotting large datasets?**
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. That said, you can always downsample extremely large datasets by telling ImPlot to stride your data at larger intervals if needed. 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. That said, you can always downsample extremely large datasets by telling ImPlot to stride your data at larger intervals if needed. Also try the experimental `backends` branch which aims to provide GPU acceleration support.
**Q: What data types can I plot?** **Q: What data types can I plot?**
A: ImPlot plotting functions accept most scalar types: A: ImPlot plotting functions accept most scalar types:
`float`, `double`, `int8`, `uint8`, `int16`, `uint16`, `int32`, `uint32`, `int64`, `uint64`. Arrays of custom structs or classes (e.g. `Vector2f` or similar) are easily passed to ImPlot functions using the built in striding features (see `implot.h` for documentation). `float`, `double`, `int8`, `uint8`, `int16`, `uint16`, `int32`, `uint32`, `int64`, `uint64`. Arrays of custom structs or classes (e.g. `Vector2f` or similar) are easily passed to ImPlot functions using the built-in striding features (see `implot.h` for documentation), and many plotters provide a "getter" overload which accepts data generating callbacks. You can fully customize the list of accepted types by defining `IMPLOT_CUSTOM_NUMERIC_TYPES` at compile time: see doc in `implot_items.cpp`.
**Q: Can plot styles be modified?** **Q: Can plot styles be modified?**
@ -135,7 +147,7 @@ A: Yep! Both logscale and timescale are supported.
**Q: Does ImPlot support multiple y-axes? x-axes?** **Q: Does ImPlot support multiple y-axes? x-axes?**
A: Yes. Up to three y-axes can be enabled. Multiple x-axes are not supported. A: Yes. Up to three x-axes and three y-axes can be enabled.
**Q: Does ImPlot support [insert plot type]?** **Q: Does ImPlot support [insert plot type]?**
@ -157,9 +169,9 @@ A: Not exactly, but it does give you the ability to query plot sub-ranges, with
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. 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.
**Q: Can a compile ImPlot as a dynamic library?** **Q: Can I compile ImPlot as a dynamic library?**
A: Like ImGui, it is recommended that you compile and link ImPlot as a *static* library or directly as a part of your sources. However, if you are compiling ImPlot and ImGui as separate DLLs, make sure you set the current *ImGui* context with `ImPlot::SetImGuiContext(ImGuiContext* ctx)`. This ensures that global ImGui variables are correctly shared across the DLL boundary. A: Like ImGui, it is recommended that you compile and link ImPlot as a *static* library or directly as a part of your sources. However, if you must and are compiling ImPlot and ImGui as separate DLLs, make sure you set the current *ImGui* context with `ImPlot::SetImGuiContext(ImGuiContext* ctx)`. This ensures that global ImGui variables are correctly shared across the DLL boundary.
**Q: Can ImPlot be used with other languages/bindings?** **Q: Can ImPlot be used with other languages/bindings?**

100
TODO.md Normal file
View File

@ -0,0 +1,100 @@
The list below represents a combination of high-priority work, nice-to-have features, and random ideas. We make no guarantees that all of this work will be completed or even started. If you see something that you need or would like to have, let us know, or better yet consider submitting a PR for the feature.
## API
## Axes
- add flag to remove weekends on Time axis
- pixel space scale (`ImPlotTransform_Display`), normalized space scale (`ImPlotTransform_Axes`), data space scale (`ImPlotTransform_Data`)
- make ImPlotFlags_Equal not a flag -> `SetupEqual(ImPlotAxis x, ImPlotAxis y)`
- allow inverted arguments `SetAxes` to transpose data?
- `SetupAxisColors()`
- `SetupAxisHome()`
## Plot Items
- add `PlotBubbles` (see MATLAB bubble chart)
- add non-zero references for `PlotBars` etc.
- add exploding to `PlotPieChart` (on hover-highlight?)
- fix appearance of `PlotBars` spacing
## Styling
- support gradient and/or colormap sampled fills (e.g. ImPlotFillStyle_)
- API for setting different fonts for plot elements
## Colormaps
- gradient editing tool
- `RemoveColormap`
- `enum ImPlotColorRule_ { Solid, Faded, XValue, YValue, ZValue }`
## Legend
- `ImPlotLegendFlags_Scroll`
- improve legend icons (e.g. adopt markers, gradients, etc)
- make legend frame use ButtonBehavior (maybe impossible)
## Tools / Misc.
- add `IsPlotChanging` to detect change in limits
- add ability to extend plot/axis context menus
- add LTTB downsampling for lines
- add box selection to axes
- first frame render delay might fix "fit pop" effect
- move some code to new `implot_tools.cpp`
- ColormapSlider (see metrics)
- FillAlpha should not affect markers?
- fix mouse text for time axes
## Optimizations
- find faster way to buffer data into ImDrawList (very slow)
- reduce number of calls to `PushClipRect`
- explore SIMD operations for high density plot items
## Plotter Pipeline
Ideally every `PlotX` function should use our faster rendering pipeline when it is applicable.
` User Data > Getter > Fitter > Renderer > RenderPrimitives`
|Plotter|Getter|Fitter|Renderer|RenderPrimitives|
|---|:-:|:-:|:-:|:-:|
|PlotLine|Yes|Yes|Yes|Yes|
|PlotScatter|Yes|Yes|Yes|Yes|
|PlotStairs|Yes|Yes|Yes|Yes|
|PlotShaded|Yes|Yes|Yes|Yes|
|PlotBars|Yes|Yes|Yes|Yes|
|PlotBarGroups|:|:|:|:|
|PlotHistogram|:|:|:|:|
|PlotErrorBars|Yes|Yes|No|No|
|PlotStems|Yes|Yes|Yes|Yes|
|PlotInfLines|Yes|Yes|Yes|Yes|
|PlotPieChart|No|No|No|No|
|PlotHeatmap|Yes|No|Yes|Mixed|
|PlotHistogram2D|:|:|:|:|
|PlotDigital|Yes|No|No|No|
|PlotImage|-|-|-|-|
|PlotText|-|-|-|-|
|PlotDummy|-|-|-|-|
## Completed
- make BeginPlot take fewer args:
- make query a tool -> `DragRect`
- rework DragLine/Point to use ButtonBehavior
- add support for multiple x-axes and don't limit count to 3
- make axis side configurable (top/left, right/bottom) via new flag `ImPlotAxisFlags_Opposite`
- add support for setting tick label strings via callback
- give each axis an ID, remove ad-hoc DND solution
- allow axis to be drag to opposite side (ala ImGui Table headers)
- legend items can be hovered even if plot is not
- fix frame delay on DragX tools
- remove tag from drag line/point -> add `Tag` tool
- add shortcut/legacy overloads for BeginPlot
- `SetupAxisConstraints()`
- `SetupAxisScale()`
- add `ImPlotLineFlags`, `ImPlotBarsFlags`, etc. for each plot type
- add `PlotBarGroups` wrapper that makes rendering groups of bars easier, with stacked bar support
- `PlotBars` restore outlines
- add hover/active color for plot axes

4701
implot.cpp

File diff suppressed because it is too large Load Diff

961
implot.h

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff