A C++ Graphics Library for Data Visualization
Data visualization can help programmers and scientists identify trends in their data and efficiently communicate these results with their peers. Modern C++ is being used for a variety of scientific applications, and this environment can benefit considerably from graphics libraries that attend the typical design goals toward scientific data visualization. Besides the option of exporting results to other environments, the customary alternatives in C++ are either non-dedicated libraries that depend on existing user interfaces or bindings to other languages. Matplot++ is a graphics library for data visualization that provides interactive plotting, means for exporting plots in high-quality formats for scientific publications, a compact syntax consistent with similar libraries, dozens of plot categories with specialized algorithms, multiple coding styles, and supports generic backends.
Table of Contents
You can use Matplot++ directly in CMake projects as a subproject, without installing it. This is convenient if you are experimenting with this library for the first time or don't expect your users to have Matplot++ installed on their systems.
Check if you have Cmake 3.14+ installed:
cmake --version
Clone the whole project
git clone https://github.com/alandefreitas/matplotplusplus/
and add the subdirectory to your CMake project:
add_subdirectory(matplotplusplus)
When creating your executable, link the library to the targets you want:
add_executable(my_target main.cpp)
target_link_libraries(my_target PUBLIC matplot)
Add this header to your source files:
#include <matplot/matplot.h>
However, in larger projects, it's always recommended to look for Matplot++ with find_package
before including it as a subdirectory to avoid ODR errors.
FetchContent
is a CMake command that can automatically download the Matplot++ repository. Check if you have Cmake 3.14+ installed:
cmake --version
Include FetchContent in your CMake build script:
include(FetchContent)
Declare the source for the contents:
FetchContent_Declare(matplotplusplus
GIT_REPOSITORY https://github.com/alandefreitas/matplotplusplus
GIT_TAG origin/master # or whatever tag you want
Let CMake download the repository and include it as a subdirectory.
FetchContent_GetProperties(matplotplusplus)
if(NOT matplotplusplus_POPULATED)
FetchContent_Populate(matplotplusplus)
add_subdirectory(${matplotplusplus_SOURCE_DIR} ${matplotplusplus_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
When creating your executable, link the library to the targets you want:
add_executable(my_target main.cpp)
target_link_libraries(my_target PUBLIC matplot)
Then add this header to your source files:
#include <matplot/matplot.h>
However, in larger projects, it's always recommended to look for Matplot++ with find_package
before including it as a subdirectory to avoid ODR errors.
CPM.cmake is a nice wrapper around the CMake FetchContent
function.
Check if you have Cmake 3.14+ installed:
cmake --version
Install CPM.cmake and then use this command to add Matplot++ to your build script:
CPMAddPackage(
NAME matplotplusplus
GITHUB_REPOSITORY alandefreitas/matplotplusplus
GIT_TAG origin/master # or whatever tag you want
)
# ...
target_link_libraries(my_target PUBLIC matplot)
Then add this header to your source files:
#include <matplot/matplot.h>
However, in larger projects, it's always recommended to look for Matplot++ with find_package
before including it as a subdirectory to avoid ODR errors.
You can use:
option(CPM_USE_LOCAL_PACKAGES "Try `find_package` before downloading dependencies" ON)
in your build script to let CPM.cmake do that for you.
If you have the library installed on your system, you can call find_package()
from your CMake build script.
find_package(Matplot++ REQUIRED)
When creating your executable, link the library to the targets you want:
add_executable(my_target main.cpp)
target_link_libraries(my_target PUBLIC Matplot++::matplot)
Then add this header to your source files:
#include <matplot/matplot.h>
You can see a complete example in test/integration/CMakeLists.txt
.
CMake should be able to locate the matplot++-config.cmake
script automatically if you installed the library under /usr/local/
(Linux / Mac OS). Unfortunately, there is no easy default directory for find_package
on Windows.
!!! warning "Default directories"
By default, the library is likely to be in `/usr/local/` (Linux / Mac OS) or `C:/Program Files/` (Windows). The installer will try to find the directory where you usually keep your libraries but that's not always perfect.
!!! warning "Finding packages on Windows"
Unfortunately, CMake does not have a single default directory for packages on Windows like `/usr/local/lib`. If CMake cannot find Matplot++ on Windows or if you installed the library outside the default directory on Linux/Mac OS, there are a few [options](https://stackoverflow.com/questions/21314893/what-is-the-default-search-path-for-find-package-in-windows-using-cmake):
* **Environment Variables**: The most reliable way to set this default directory is through environment variables. You can create an environment variable `MATPLOTPP_DIR` and then add `$ENV{MATPLOTPP_DIR}` to the `HINTS` section of the `find_package` command. This tends to be more convenient than requiring the path on the command line every time. Starting with version 3.12, CMake now implicitly considers the `<PackageName>_Root` environment variable a HINT for every `find_package` call.
* **Package Registry**: CMake offers the [Package Registry](https://cmake.org/cmake/help/v3.5/manual/cmake-packages.7.html#package-registry) as an alternative mechanism for finding package locations. CMake maintains a list of package information in the Windows registry under `HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\`.
* **Append CMAKE_MODULE_PATH**: You can append more directories to [`CMAKE_MODULE_PATH`](https://cmake.org/cmake/help/latest/variable/CMAKE_MODULE_PATH.html) with something like `list(APPEND CMAKE_MODULE_PATH "C:\\Program Files\\matplotplusplus 1.0.1")`. `CMAKE_MODULE_PATH` is a list of search paths for CMake modules to be loaded by the `include()` or `find_package()` commands.
* **Set the DIR variable directly**: Directly set the `Matplot++_DIR` variable with something like `set(Matplot++_DIR "C:\\Program Files\\matplotplusplus 1.0.1\\lib\\cmake\\Matplot++")`. This might be good enough for small local projects but it is hard-coding the directory in your build script. When your library gets out of your local environment, you need to choose one of the other options above (better) or make this variable an option and require the user to provide the directory on the command line every time (worse).
It's often useful to let your build script download Matplot++ when find_package fails. If using CPM.cmake, you can set the CPM_USE_LOCAL_PACKAGES
option to try to find_package(Matplot++)
before download Matplot++.
If using FetchContent, you can use the following pattern:
find_package(Matplot++ QUIET)
if(NOT Matplot++_FOUND)
# Put your FetchContent or CPM.cmake script here
endif()
Get the binary package from the release section. These binaries refer to the last release version of Matplot++.
If you need a more recent version of Matplot++, you can download the binary packages from the CI artifacts or build the library from the source files.
Mac users can install Matplot++ with Homebrew:
brew install matplotplusplus
This formula is a contribution to Homebrew by Andrew Kane.
Matplot++ is available in the Arch User Repository
(AUR) as
matplotplusplus
.
Note you can manually install the package by following the instructions on the
Arch Wiki
or use an AUR helper like
yay
(recommended for ease of install).
yay -S matplotplusplus
To discuss any issues related to this package refer to the comments section on
the AUR page of matplotplusplus
here.
C++17
Make sure your C++ compiler supports C++17:
=== "Ubuntu + GCC"
```bash
g++ --version
```
=== "Mac Os + Clang"
```bash
clang --version
```
=== "Windows + MSVC"
!!! warning ""
* Visit the [Visual Studio](https://visualstudio.microsoft.com) website
* Download Git from [https://git-scm.com/download/win](https://git-scm.com/download/win) and install it
The output should be something like:
=== "Ubuntu + GCC"
```console
g++-8 (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
```
=== "Mac Os + Clang"
```console
Apple clang version 11.0.0 (clang-1100.0.33.8)
```
=== "Windows + MSVC"
!!! warning ""
* Visit the [Visual Studio](https://visualstudio.microsoft.com) website
* Download Git from [https://git-scm.com/download/win](https://git-scm.com/download/win) and install it
If you need to update your compiler:
=== "Ubuntu + GCC"
```bash
# install GCC-8
sudo apt update
sudo apt install gcc-8
sudo apt install g++-8
```
To update to any other version, like GCC-9 or GCC-10:
```bash
sudo apt install build-essential
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt install g++-10
```
Once you installed a newer version of GCC, you can link it to `update-alternatives`. For instance, if you have GCC-7 and GCC-10, you can link them with:
```bash
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
```
You can now use `update-alternatives` to set your default `gcc` and `g++` to a more recent version:
```bash
update-alternatives --config g++
update-alternatives --config gcc
```
=== "Mac Os + Clang"
```bash
# download clang
curl --output clang.tar.xz -L https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/clang+llvm-11.0.0-x86_64-apple-darwin.tar.xz
mkdir clang
tar -xvJf clang.tar.xz -C clang
# copy files to /usr/local
cd clang/clang+llvm-11.0.0-x86_64-apple-darwin
sudo cp -R * /usr/local/
# update default compiler
export CXX=/usr/local/bin/clang++
```
=== "Windows + MSVC"
!!! warning ""
* Visit the [Visual Studio](https://visualstudio.microsoft.com) website
* Download Git from [https://git-scm.com/download/win](https://git-scm.com/download/win) and install it
CMake 3.14+
Also check your CMake version is at least 3.14+:
=== "Ubuntu + GCC"
```bash
cmake --version
```
=== "Mac Os + Clang"
```bash
cmake --version
```
=== "Windows + MSVC"
```bash
cmake --version
```
If CMake is not installed or its version is older than CMake 3.14, update it with
=== "Ubuntu + GCC"
```bash
sudo apt upgrade cmake
```
!!! warning ""
Alternatively, download the most recent version from [cmake.org](https://cmake.org/).
=== "Mac Os + Clang"
```bash
sudo brew upgrade cmake
```
!!! warning "Homebrew"
If this command fails because you don't have [Homebrew](https://brew.sh) on your computer, you can install it with
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
or you can follow the instructions in [https://brew.sh](https://brew.sh).
!!! warning ""
Alternatively, download the most recent version from [cmake.org](https://cmake.org/).
=== "Windows + MSVC"
!!! warning ""
Download the most recent version from [cmake.org](https://cmake.org/).
Gnuplot 5.2.6+
Install Gnuplot 5.2.6+ (Required at runtime)
=== "Ubuntu + GCC"
```bash
sudo apt update
sudo apt install gnuplot
```
!!! note ""
Or download the latest version from [www.gnuplot.info](http://www.gnuplot.info). If you're using an installer, make sure you mark the option "Add application directory to your PATH environment variable".
=== "Mac Os + Clang"
```bash
sudo brew install gnuplot
```
!!! note ""
Or download the latest version from [www.gnuplot.info](http://www.gnuplot.info). If you're using an installer, make sure you mark the option "Add application directory to your PATH environment variable".
=== "Windows + MSVC"
!!! warning ""
Download Gnuplot from [www.gnuplot.info](http://www.gnuplot.info) and install it.
If you're using the Gnuplot installer, make sure you mark the option "Add application directory to your PATH environment variable"
!!! warning "Windows Gnuplot Terminals"
If the Matplot++ examples don't display without console errors and gnuplot running, try to re-install Gnuplot with the wxt terminal.
Optional Dependencies
The build script will also look for these optional dependencies for manipulating images:
- JPEG
- TIFF
- ZLIB
- PNG
- LAPACK
- BLAS
- FFTW
- OpenCV
Embedded dependencies
There are two dependencies in source/3rd_party
. These dependencies are bundled, so you don't have to worry about them:
- olvb/nodesoup
- dtschump/CImg
You can define WITH_SYSTEM_NODESOUP=ON
or WITH_SYSTEM_CIMG=ON
in the cmake command line to use a system-provided version of these dependencies.
OpenGL dependencies
There's an extra target matplot_opengl
with the experimental OpenGL backend. You need to define BUILD_EXPERIMENTAL_OPENGL_BACKEND=ON
in the CMake command line to build that target. In that case, the build script will also look for these extra dependencies:
- OpenGL
- GLAD
- GLFW3
If these dependencies are not found, the build script will download them. In any case, you can install these dependencies with:
=== "Ubuntu + GCC"
```bash
sudo apt-get install libglfw3-dev
```
=== "Mac Os + Clang"
!!! note ""
Download GLFW3 from https://www.glfw.org
=== "Windows + MSVC"
!!! note ""
Download GLFW3 from https://www.glfw.org
You can also see all dependencies in source/3rd_party/CMakeLists.txt
.
Building Examples
This will build the examples in the build/examples
directory:
=== "Ubuntu + GCC"
```bash
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O2"
sudo cmake --build . --parallel 2 --config Release
```
=== "Mac Os + Clang"
```bash
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O2"
cmake --build . --parallel 2 --config Release
```
=== "Windows + MSVC"
```bash
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="/O2"
cmake --build . --parallel 2 --config Release
```
!!! hint "Parallel Build"
Replace --parallel 2
with --parallel <number of cores in your machine>
!!! note "Setting C++ Compiler"
If your C++ compiler that supports C++17 is not your default compiler, make sure you provide CMake with the compiler location with the DCMAKE_C_COMPILER and DCMAKE_CXX_COMPILER options. For instance:
```bash
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O2" -DCMAKE_C_COMPILER=/usr/bin/gcc-8 -DCMAKE_CXX_COMPILER=/usr/bin/g++-8
```
Installing
You can 1) use -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF
to bypass the examples and tests, and then 2) cmake --install .
to install Matplot++ on your system:
=== "Ubuntu + GCC"
```bash
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O2" -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF
sudo cmake --build . --parallel 2 --config Release
sudo cmake --install .
```
=== "Mac Os + Clang"
```bash
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O2" -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF
cmake --build . --parallel 2 --config Release
cmake --install .
```
=== "Windows + MSVC"
```bash
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="/O2" -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF
cmake --build . --parallel 2 --config Release
cmake --install .
```
!!! hint "Parallel Build"
Replace --parallel 2
with --parallel <number of cores in your machine>
Create packages
You can also create the binary packages to install Matplot++ on other systems:
=== "Ubuntu + GCC"
```bash
sudo cpack .
```
=== "Mac Os + Clang"
```bash
cpack .
```
=== "Windows + MSVC"
```bash
cpack .
```
Line Plot | Line Plot 3D | Stairs | Error Bars | Area | Loglog Plot | Semilogx Plot | Semilogy Plot | Function Plot | Function Plot 3D | Implicit function
!!! tip Use these examples to understand how to quickly use the library for data visualization. If you are interested in understanding how the library works, you can later read the details in the complete article.
plot(x,y);
Where x
and y
are are any value ranges.
=== "Plot"
[![example_plot_1](docs/examples/line_plot/plot/plot_1.svg)](examples/line_plot/plot/plot_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_1.cpp"
```
!!! tip
Setters return a reference to *this
to allow method chaining:
```cpp
plot(x,y)->line_width(2).color("red");
```
!!! tip These examples use free-standing functions to create plots. You can also use a object-oriented style for plots. We discuss these coding styles in the Section Coding Styles.
More examples
===! "Plot"
[![example_plot_2](docs/examples/line_plot/plot/plot_2.svg)](examples/line_plot/plot/plot_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_2.cpp"
```
===! "Plot"
[![example_plot_3](docs/examples/line_plot/plot/plot_3.svg)](examples/line_plot/plot/plot_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_3.cpp"
```
===! "Plot"
[![example_plot_4](docs/examples/line_plot/plot/plot_4.svg)](examples/line_plot/plot/plot_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_4.cpp"
```
===! "Plot"
[![example_plot_5](docs/examples/line_plot/plot/plot_5.svg)](examples/line_plot/plot/plot_5.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_5.cpp"
```
===! "Plot"
[![example_plot_6](docs/examples/line_plot/plot/plot_6.svg)](examples/line_plot/plot/plot_6.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_6.cpp"
```
===! "Plot"
[![example_plot_7](docs/examples/line_plot/plot/plot_7.svg)](examples/line_plot/plot/plot_7.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_7.cpp"
```
===! "Plot"
[![example_plot_8](docs/examples/line_plot/plot/plot_8.svg)](examples/line_plot/plot/plot_8.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_8.cpp"
```
===! "Plot"
[![example_plot_9](docs/examples/line_plot/plot/plot_9.svg)](examples/line_plot/plot/plot_9.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_9.cpp"
```
===! "Plot"
[![example_plot_10](docs/examples/line_plot/plot/plot_10.svg)](examples/line_plot/plot/plot_10.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_10.cpp"
```
===! "Plot"
[![example_plot_11](docs/examples/line_plot/plot/plot_11.svg)](examples/line_plot/plot/plot_11.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_11.cpp"
```
===! "Plot"
[![example_plot_12](docs/examples/line_plot/plot/plot_12.svg)](examples/line_plot/plot/plot_12.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot/plot_12.cpp"
```
plot3(x,y);
=== "Plot"
[![example_plot3_1](docs/examples/line_plot/plot3/plot3_1.svg)](examples/line_plot/plot3/plot3_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_1.cpp"
```
!!! tip With method chaining:
```cpp
plot3(x,y)->line_width(2).color("red");
```
More examples
===! "Plot"
[![example_plot3_2](docs/examples/line_plot/plot3/plot3_2.svg)](examples/line_plot/plot3/plot3_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_2.cpp"
```
===! "Plot"
[![example_plot3_3](docs/examples/line_plot/plot3/plot3_3.svg)](examples/line_plot/plot3/plot3_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_3.cpp"
```
===! "Plot"
[![example_plot3_4](docs/examples/line_plot/plot3/plot3_4.png)](examples/line_plot/plot3/plot3_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_4.cpp"
```
===! "Plot"
[![example_plot3_5](docs/examples/line_plot/plot3/plot3_5.svg)](examples/line_plot/plot3/plot3_5.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_5.cpp"
```
===! "Plot"
[![example_plot3_7](docs/examples/line_plot/plot3/plot3_7.svg)](examples/line_plot/plot3/plot3_7.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_7.cpp"
```
===! "Plot"
[![example_plot3_8](docs/examples/line_plot/plot3/plot3_8.svg)](examples/line_plot/plot3/plot3_8.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_8.cpp"
```
===! "Plot"
[![example_plot3_9](docs/examples/line_plot/plot3/plot3_9.svg)](examples/line_plot/plot3/plot3_9.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_9.cpp"
```
===! "Plot"
[![example_plot3_10](docs/examples/line_plot/plot3/plot3_10.svg)](examples/line_plot/plot3/plot3_10.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/plot3/plot3_10.cpp"
```
stairs(x,y);
The stair
object renders the line with stairs between data points to denote discrete data.
===! "Plot"
[![example_stairs_2](docs/examples/line_plot/stairs/stairs_2.svg)](examples/line_plot/stairs/stairs_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_2.cpp"
```
More examples
===! "Plot"
[![example_stairs_3](docs/examples/line_plot/stairs/stairs_3.svg)](examples/line_plot/stairs/stairs_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_3.cpp"
```
===! "Plot"
[![example_stairs_4](docs/examples/line_plot/stairs/stairs_4.svg)](examples/line_plot/stairs/stairs_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_4.cpp"
```
===! "Plot"
[![example_stairs_5](docs/examples/line_plot/stairs/stairs_5.svg)](examples/line_plot/stairs/stairs_5.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_5.cpp"
```
===! "Plot"
[![example_stairs_6](docs/examples/line_plot/stairs/stairs_6.svg)](examples/line_plot/stairs/stairs_6.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_6.cpp"
```
===! "Plot"
[![example_stairs_7](docs/examples/line_plot/stairs/stairs_7.svg)](examples/line_plot/stairs/stairs_7.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_7.cpp"
```
===! "Plot"
[![example_stairs_8](docs/examples/line_plot/stairs/stairs_8.svg)](examples/line_plot/stairs/stairs_8.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_8.cpp"
```
===! "Plot"
[![example_stairs_9](docs/examples/line_plot/stairs/stairs_9.svg)](examples/line_plot/stairs/stairs_9.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_9.cpp"
```
===! "Plot"
[![example_stairs_10](docs/examples/line_plot/stairs/stairs_10.svg)](examples/line_plot/stairs/stairs_10.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/stairs/stairs_10.cpp"
```
errorbar(x,y,err);
===! "Plot"
[![example_errorbar_1](docs/examples/line_plot/errorbar/errorbar_1.svg)](examples/line_plot/errorbar/errorbar_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_1.cpp"
```
More examples
===! "Plot"
[![example_errorbar_2](docs/examples/line_plot/errorbar/errorbar_2.svg)](examples/line_plot/errorbar/errorbar_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_2.cpp"
```
===! "Plot"
[![example_errorbar_3](docs/examples/line_plot/errorbar/errorbar_3.svg)](examples/line_plot/errorbar/errorbar_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_3.cpp"
```
===! "Plot"
[![example_errorbar_4](docs/examples/line_plot/errorbar/errorbar_4.svg)](examples/line_plot/errorbar/errorbar_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_4.cpp"
```
===! "Plot"
[![example_errorbar_5](docs/examples/line_plot/errorbar/errorbar_5.svg)](examples/line_plot/errorbar/errorbar_5.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_5.cpp"
```
===! "Plot"
[![example_errorbar_6](docs/examples/line_plot/errorbar/errorbar_6.svg)](examples/line_plot/errorbar/errorbar_6.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_6.cpp"
```
===! "Plot"
[![example_errorbar_7](docs/examples/line_plot/errorbar/errorbar_7.svg)](examples/line_plot/errorbar/errorbar_7.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_7.cpp"
```
===! "Plot"
[![example_errorbar_8](docs/examples/line_plot/errorbar/errorbar_8.svg)](examples/line_plot/errorbar/errorbar_8.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_8.cpp"
```
===! "Plot"
[![example_errorbar_9](docs/examples/line_plot/errorbar/errorbar_9.svg)](examples/line_plot/errorbar/errorbar_9.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_9.cpp"
```
===! "Plot"
[![example_errorbar_10](docs/examples/line_plot/errorbar/errorbar_10.svg)](examples/line_plot/errorbar/errorbar_10.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/errorbar/errorbar_10.cpp"
```
The error bar
object includes extra lines to represent error around data points. Log plots are utility functions that adjust the x or y axes to a logarithmic scale.
area(Y);
===! "Plot"
[![example_area_1](docs/examples/line_plot/area/area_1.svg)](examples/line_plot/area/area_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/area/area_1.cpp"
```
More examples
===! "Plot"
[![example_area_2](docs/examples/line_plot/area/area_2.svg)](examples/line_plot/area/area_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/area/area_2.cpp"
```
===! "Plot"
[![example_area_3](docs/examples/line_plot/area/area_3.svg)](examples/line_plot/area/area_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/area/area_3.cpp"
```
===! "Plot"
[![example_area_4](docs/examples/line_plot/area/area_4.svg)](examples/line_plot/area/area_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/area/area_4.cpp"
```
loglog(x,y);
===! "Plot"
[![example_loglog_1](docs/examples/line_plot/loglog/loglog_1.svg)](examples/line_plot/loglog/loglog_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_1.cpp"
```
More examples
===! "Plot"
[![example_loglog_2](docs/examples/line_plot/loglog/loglog_2.svg)](examples/line_plot/loglog/loglog_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_2.cpp"
```
===! "Plot"
[![example_loglog_3](docs/examples/line_plot/loglog/loglog_3.png)](examples/line_plot/loglog/loglog_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_3.cpp"
```
===! "Plot"
[![example_loglog_4](docs/examples/line_plot/loglog/loglog_4.svg)](examples/line_plot/loglog/loglog_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_4.cpp"
```
===! "Plot"
[![example_loglog_5](docs/examples/line_plot/loglog/loglog_5.png)](examples/line_plot/loglog/loglog_5.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_5.cpp"
```
===! "Plot"
[![example_loglog_6](docs/examples/line_plot/loglog/loglog_6.svg)](examples/line_plot/loglog/loglog_6.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_6.cpp"
```
===! "Plot"
[![example_loglog_7](docs/examples/line_plot/loglog/loglog_7.svg)](examples/line_plot/loglog/loglog_7.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_7.cpp"
```
===! "Plot"
[![example_loglog_8](docs/examples/line_plot/loglog/loglog_8.svg)](examples/line_plot/loglog/loglog_8.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_8.cpp"
```
===! "Plot"
[![example_loglog_9](docs/examples/line_plot/loglog/loglog_9.svg)](examples/line_plot/loglog/loglog_9.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/loglog/loglog_9.cpp"
```
semilogx(x,y);
===! "Plot"
[![example_semilogx_1](docs/examples/line_plot/semilogx/semilogx_1.svg)](examples/line_plot/semilogx/semilogx_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/semilogx/semilogx_1.cpp"
```
semilogy(x,y);
===! "Plot"
[![example_semilogy_1](docs/examples/line_plot/semilogy/semilogy_1.svg)](examples/line_plot/semilogy/semilogy_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/semilogy/semilogy_1.cpp"
```
fplot(fx);
===! "Plot"
[![example_fplot_1](docs/examples/line_plot/fplot/fplot_1.svg)](examples/line_plot/fplot/fplot_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot/fplot_1.cpp"
```
More examples
===! "Plot"
[![example_fplot_2](docs/examples/line_plot/fplot/fplot_2.svg)](examples/line_plot/fplot/fplot_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot/fplot_2.cpp"
```
===! "Plot"
[![example_fplot_3](docs/examples/line_plot/fplot/fplot_3.png)](examples/line_plot/fplot/fplot_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot/fplot_3.cpp"
```
===! "Plot"
[![example_fplot_4](docs/examples/line_plot/fplot/fplot_4.png)](examples/line_plot/fplot/fplot_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot/fplot_4.cpp"
```
===! "Plot"
[![example_fplot_5](docs/examples/line_plot/fplot/fplot_5.png)](examples/line_plot/fplot/fplot_5.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot/fplot_5.cpp"
```
===! "Plot"
[![example_fplot_6](docs/examples/line_plot/fplot/fplot_6.svg)](examples/line_plot/fplot/fplot_6.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot/fplot_6.cpp"
```
Instead of storing data points, the objects function line
and string function
store a function as a lambda function or as a string with an expression. These objects use lazy evaluation to generate absolute data points. The data is generated only when the draw
function is called.
fplot(fxy);
===! "Plot"
[![example_fplot3_1](docs/examples/line_plot/fplot3/fplot3_1.svg)](examples/line_plot/fplot3/fplot3_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot3/fplot3_1.cpp"
`````
More examples
===! "Plot"
[![example_fplot3_2](docs/examples/line_plot/fplot3/fplot3_2.svg)](examples/line_plot/fplot3/fplot3_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot3/fplot3_2.cpp"
```
===! "Plot"
[![example_fplot3_3](docs/examples/line_plot/fplot3/fplot3_3.png)](examples/line_plot/fplot3/fplot3_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot3/fplot3_3.cpp"
```
===! "Plot"
[![example_fplot3_4](docs/examples/line_plot/fplot3/fplot3_4.svg)](examples/line_plot/fplot3/fplot3_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot3/fplot3_4.cpp"
```
===! "Plot"
[![example_fplot3_5](docs/examples/line_plot/fplot3/fplot3_5.svg)](examples/line_plot/fplot3/fplot3_5.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fplot3/fplot3_5.cpp"
```
fplot(fxy);
===! "Plot"
[![example_fimplicit_1](docs/examples/line_plot/fimplicit/fimplicit_1.svg)](examples/line_plot/fimplicit/fimplicit_1.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fimplicit/fimplicit_1.cpp"
```
More examples
===! "Plot"
[![example_fimplicit_2](docs/examples/line_plot/fimplicit/fimplicit_2.svg)](examples/line_plot/fimplicit/fimplicit_2.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fimplicit/fimplicit_2.cpp"
```
===! "Plot"
[![example_fimplicit_3](docs/examples/line_plot/fimplicit/fimplicit_3.svg)](examples/line_plot/fimplicit/fimplicit_3.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fimplicit/fimplicit_3.cpp"
```
===! "Plot"
[![example_fimplicit_4](docs/examples/line_plot/fimplicit/fimplicit_4.svg)](examples/line_plot/fimplicit/fimplicit_4.cpp)
=== "C++"
```cpp
--8<-- "examples/line_plot/fimplicit/fimplicit_4.cpp"
```
Histogram | Boxplot | Scatter Plot | Scatter Plot 3D | Binned Scatter Plots | Plot Matrix | Parallel Coordinates | Pie Chart | Heatmap | Word Cloud
The histogram
object creates the histogram edges and bins when the draw
function is called for the first time with lazy evaluation. Lazy evaluation avoids calculating edges unnecessarily in case the user changes the object parameters before calling draw
. This object includes several algorithms for automatically delimiting the edges and bins for the histograms.
hist(data);
===! "Plot"
[![example_histogram_1](docs/examples/data_distribution/histogram/histogram_1.png)](examples/data_distribution/histogram/histogram_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_1.cpp"
```
More examples
===! "Plot"
[![example_histogram_2](docs/examples/data_distribution/histogram/histogram_2.png)](examples/data_distribution/histogram/histogram_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_2.cpp"
```
===! "Plot"
[![example_histogram_3](docs/examples/data_distribution/histogram/histogram_3.png)](examples/data_distribution/histogram/histogram_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_3.cpp"
```
===! "Plot"
[![example_histogram_4](docs/examples/data_distribution/histogram/histogram_4.png)](examples/data_distribution/histogram/histogram_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_4.cpp"
```
===! "Plot"
[![example_histogram_5](docs/examples/data_distribution/histogram/histogram_5.png)](examples/data_distribution/histogram/histogram_5.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_5.cpp"
```
===! "Plot"
[![example_histogram_6](docs/examples/data_distribution/histogram/histogram_6.png)](examples/data_distribution/histogram/histogram_6.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_6.cpp"
```
===! "Plot"
[![example_histogram_7](docs/examples/data_distribution/histogram/histogram_7.svg)](examples/data_distribution/histogram/histogram_7.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_7.cpp"
```
===! "Plot"
[![example_histogram_8](docs/examples/data_distribution/histogram/histogram_8.png)](examples/data_distribution/histogram/histogram_8.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_8.cpp"
```
===! "Plot"
[![example_histogram_9](docs/examples/data_distribution/histogram/histogram_9.png)](examples/data_distribution/histogram/histogram_9.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_9.cpp"
```
===! "Plot"
[![example_histogram_10](docs/examples/data_distribution/histogram/histogram_10.svg)](examples/data_distribution/histogram/histogram_10.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_10.cpp"
```
===! "Plot"
[![example_histogram_11](docs/examples/data_distribution/histogram/histogram_11.svg)](examples/data_distribution/histogram/histogram_11.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_11.cpp"
```
===! "Plot"
[![example_histogram_12](docs/examples/data_distribution/histogram/histogram_12.svg)](examples/data_distribution/histogram/histogram_12.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_12.cpp"
```
===! "Plot"
[![example_histogram_14](docs/examples/data_distribution/histogram/histogram_14.png)](examples/data_distribution/histogram/histogram_14.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/histogram/histogram_14.cpp"
```
boxplot(data);
===! "Plot"
[![example_boxplot_1](docs/examples/data_distribution/boxplot/boxplot_1.svg)](examples/data_distribution/boxplot/boxplot_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/boxplot/boxplot_1.cpp"
```
More examples
===! "Plot"
[![example_boxplot_2](docs/examples/data_distribution/boxplot/boxplot_2.svg)](examples/data_distribution/boxplot/boxplot_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/boxplot/boxplot_2.cpp"
```
===! "Plot"
[![example_boxplot_3](docs/examples/data_distribution/boxplot/boxplot_3.png)](examples/data_distribution/boxplot/boxplot_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/boxplot/boxplot_3.cpp"
```
scatter(x,y);
===! "Plot"
[![example_scatter_1](docs/examples/data_distribution/scatter/scatter_1.svg)](examples/data_distribution/scatter/scatter_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_1.cpp"
```
More examples
===! "Plot"
[![example_scatter_2](docs/examples/data_distribution/scatter/scatter_2.svg)](examples/data_distribution/scatter/scatter_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_2.cpp"
```
===! "Plot"
[![example_scatter_3](docs/examples/data_distribution/scatter/scatter_3.svg)](examples/data_distribution/scatter/scatter_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_3.cpp"
```
===! "Plot"
[![example_scatter_4](docs/examples/data_distribution/scatter/scatter_4.svg)](examples/data_distribution/scatter/scatter_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_4.cpp"
```
===! "Plot"
[![example_scatter_5](docs/examples/data_distribution/scatter/scatter_5.svg)](examples/data_distribution/scatter/scatter_5.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_5.cpp"
```
===! "Plot"
[![example_scatter_6](docs/examples/data_distribution/scatter/scatter_6.svg)](examples/data_distribution/scatter/scatter_6.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_6.cpp"
```
===! "Plot"
[![example_scatter_7](docs/examples/data_distribution/scatter/scatter_7.svg)](examples/data_distribution/scatter/scatter_7.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_7.cpp"
```
===! "Plot"
[![example_scatter_8](docs/examples/data_distribution/scatter/scatter_8.svg)](examples/data_distribution/scatter/scatter_8.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter/scatter_8.cpp"
```
Scatter plots also depend on the line
object. As the line object can represent lines with markers, the scatter
function simply creates markers without the lines.
scatter(x,y,z);
===! "Plot"
[![example_scatter3_1](docs/examples/data_distribution/scatter3/scatter3_1.svg)](examples/data_distribution/scatter3/scatter3_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter3/scatter3_1.cpp"
```
More examples
===! "Plot"
[![example_scatter3_2](docs/examples/data_distribution/scatter3/scatter3_2.svg)](examples/data_distribution/scatter3/scatter3_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter3/scatter3_2.cpp"
```
===! "Plot"
[![example_scatter3_3](docs/examples/data_distribution/scatter3/scatter3_3.svg)](examples/data_distribution/scatter3/scatter3_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter3/scatter3_3.cpp"
```
===! "Plot"
[![example_scatter3_4](docs/examples/data_distribution/scatter3/scatter3_4.svg)](examples/data_distribution/scatter3/scatter3_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter3/scatter3_4.cpp"
```
===! "Plot"
[![example_scatter3_5](docs/examples/data_distribution/scatter3/scatter3_5.svg)](examples/data_distribution/scatter3/scatter3_5.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter3/scatter3_5.cpp"
```
===! "Plot"
[![example_scatter3_6](docs/examples/data_distribution/scatter3/scatter3_6.png)](examples/data_distribution/scatter3/scatter3_6.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/scatter3/scatter3_6.cpp"
```
binscatter(x,y);
===! "Plot"
[![example_binscatter_1](docs/examples/data_distribution/binscatter/binscatter_1.png)](examples/data_distribution/binscatter/binscatter_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/binscatter/binscatter_1.cpp"
```
More examples
===! "Plot"
[![example_binscatter_2](docs/examples/data_distribution/binscatter/binscatter_2.png)](examples/data_distribution/binscatter/binscatter_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/binscatter/binscatter_2.cpp"
```
===! "Plot"
[![example_binscatter_3](docs/examples/data_distribution/binscatter/binscatter_3.png)](examples/data_distribution/binscatter/binscatter_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/binscatter/binscatter_3.cpp"
```
===! "Plot"
[![example_binscatter_4](docs/examples/data_distribution/binscatter/binscatter_4.png)](examples/data_distribution/binscatter/binscatter_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/binscatter/binscatter_4.cpp"
```
===! "Plot"
[![example_binscatter_5](docs/examples/data_distribution/binscatter/binscatter_5.png)](examples/data_distribution/binscatter/binscatter_5.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/binscatter/binscatter_5.cpp"
```
===! "Plot"
[![example_binscatter_6](docs/examples/data_distribution/binscatter/binscatter_6.png)](examples/data_distribution/binscatter/binscatter_6.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/binscatter/binscatter_6.cpp"
```
===! "Plot"
[![example_binscatter_7](docs/examples/data_distribution/binscatter/binscatter_7.svg)](examples/data_distribution/binscatter/binscatter_7.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/binscatter/binscatter_7.cpp"
```
Binned scatter plots use variations of the histogram algorithms of the previous section as an extra step to place all the data into two-dimensional bins that can be represented with varying colors or sizes. This is useful when there are so many data points that a scatter plot would be impractical for visualizing the data.
plotmatrix(X);
===! "Plot"
[![example_plotmatrix_1](docs/examples/data_distribution/plotmatrix/plotmatrix_1.svg)](examples/data_distribution/plotmatrix/plotmatrix_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/plotmatrix/plotmatrix_1.cpp"
```
More examples
===! "Plot"
[![example_plotmatrix_2](docs/examples/data_distribution/plotmatrix/plotmatrix_2.png)](examples/data_distribution/plotmatrix/plotmatrix_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/plotmatrix/plotmatrix_2.cpp"
```
===! "Plot"
[![example_plotmatrix_3](docs/examples/data_distribution/plotmatrix/plotmatrix_3.png)](examples/data_distribution/plotmatrix/plotmatrix_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/plotmatrix/plotmatrix_3.cpp"
```
===! "Plot"
[![example_plotmatrix_4](docs/examples/data_distribution/plotmatrix/plotmatrix_4.svg)](examples/data_distribution/plotmatrix/plotmatrix_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/plotmatrix/plotmatrix_4.cpp"
```
The Plot Matrix subcategory is a combination of histograms and scatter plots. It creates a matrix of axes
objects on the figure
and creates a scatter plot for each pair of data sets.
parallelplot(X);
===! "Plot"
[![example_parallelplot_1](docs/examples/data_distribution/parallelplot/parallelplot_1.svg)](examples/data_distribution/parallelplot/parallelplot_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/parallelplot/parallelplot_1.cpp"
```
More examples
===! "Plot"
[![example_parallelplot_2](docs/examples/data_distribution/parallelplot/parallelplot_2.svg)](examples/data_distribution/parallelplot/parallelplot_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/parallelplot/parallelplot_2.cpp"
```
===! "Plot"
[![example_parallelplot_3](docs/examples/data_distribution/parallelplot/parallelplot_3.svg)](examples/data_distribution/parallelplot/parallelplot_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/parallelplot/parallelplot_3.cpp"
```
The function parallelplot
creates a plot with Parallel Coordinates. In this type of plot, a parallel lines
object stores an arbitrary set of axis
objects to represent multi-dimensional data.
pie(x);
===! "Plot"
[![example_pie_1](docs/examples/data_distribution/pie/pie_1.svg)](examples/data_distribution/pie/pie_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/pie/pie_1.cpp"
```
More examples
===! "Plot"
[![example_pie_2](docs/examples/data_distribution/pie/pie_2.svg)](examples/data_distribution/pie/pie_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/pie/pie_2.cpp"
```
===! "Plot"
[![example_pie_3](docs/examples/data_distribution/pie/pie_3.svg)](examples/data_distribution/pie/pie_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/pie/pie_3.cpp"
```
===! "Plot"
[![example_pie_4](docs/examples/data_distribution/pie/pie_4.svg)](examples/data_distribution/pie/pie_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/pie/pie_4.cpp"
```
===! "Plot"
[![example_pie_5](docs/examples/data_distribution/pie/pie_5.svg)](examples/data_distribution/pie/pie_5.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/pie/pie_5.cpp"
```
===! "Plot"
[![example_pie_6](docs/examples/data_distribution/pie/pie_6.svg)](examples/data_distribution/pie/pie_6.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/pie/pie_6.cpp"
```
heatmap(data);
===! "Plot"
[![example_heatmap_1](docs/examples/data_distribution/heatmap/heatmap_1.png)](examples/data_distribution/heatmap/heatmap_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/heatmap/heatmap_1.cpp"
```
More examples
===! "Plot"
[![example_heatmap_2](docs/examples/data_distribution/heatmap/heatmap_2.png)](examples/data_distribution/heatmap/heatmap_2.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/heatmap/heatmap_2.cpp"
```
===! "Plot"
[![example_heatmap_3](docs/examples/data_distribution/heatmap/heatmap_3.png)](examples/data_distribution/heatmap/heatmap_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/heatmap/heatmap_3.cpp"
```
===! "Plot"
[![example_heatmap_4](docs/examples/data_distribution/heatmap/heatmap_4.png)](examples/data_distribution/heatmap/heatmap_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/heatmap/heatmap_4.cpp"
```
===! "Plot"
[![example_heatmap_5](docs/examples/data_distribution/heatmap/heatmap_5.png)](examples/data_distribution/heatmap/heatmap_5.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/heatmap/heatmap_5.cpp"
```
===! "Plot"
[![example_heatmap_6](docs/examples/data_distribution/heatmap/heatmap_6.png)](examples/data_distribution/heatmap/heatmap_6.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/heatmap/heatmap_6.cpp"
```
===! "Plot"
[![example_heatmap_7](docs/examples/data_distribution/heatmap/heatmap_7.png)](examples/data_distribution/heatmap/heatmap_7.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/heatmap/heatmap_7.cpp"
```
wordcloud(text, black_list);
===! "Plot"
[![example_wordcloud_1](docs/examples/data_distribution/wordcloud/wordcloud_1.png)](examples/data_distribution/wordcloud/wordcloud_1.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/wordcloud/wordcloud_1.cpp"
```
More examples
===! "Plot"
[![example_wordcloud_3](docs/examples/data_distribution/wordcloud/wordcloud_3.png)](examples/data_distribution/wordcloud/wordcloud_3.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/wordcloud/wordcloud_3.cpp"
```
===! "Plot"
[![example_wordcloud_4](docs/examples/data_distribution/wordcloud/wordcloud_4.png)](examples/data_distribution/wordcloud/wordcloud_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/wordcloud/wordcloud_4.cpp"
```
===! "Plot"
[![example_wordcloud_4](docs/examples/data_distribution/wordcloud/wordcloud_4.png)](examples/data_distribution/wordcloud/wordcloud_4.cpp)
=== "C++"
```cpp
--8<-- "examples/data_distribution/wordcloud/wordcloud_4.cpp"
```
Word clouds are generated from text or pairs of words and their frequency. After attributing a size proportional to each word frequency, the algorithm to position the labels iterates words from the largest to the smallest. For each word, it spins the word in polar coordinates converted to Cartesian coordinates until it does not overlap with any other word.
By default, the colors and the sizes depend on the word frequencies. We can customize the colors by passing a third parameter to the wordcloud
function.
Bar Plot | Pareto Chart | Stem Plot | Stem Plot 3D
bar(y);
===! "Plot"
[![example_bar_1](docs/examples/discrete_data/bar/bar_1.png)](examples/discrete_data/bar/bar_1.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_1.cpp"
```
More examples
===! "Plot"
[![example_bar_2](docs/examples/discrete_data/bar/bar_2.png)](examples/discrete_data/bar/bar_2.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_2.cpp"
```
===! "Plot"
[![example_bar_3](docs/examples/discrete_data/bar/bar_3.png)](examples/discrete_data/bar/bar_3.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_3.cpp"
```
===! "Plot"
[![example_bar_4](docs/examples/discrete_data/bar/bar_4.png)](examples/discrete_data/bar/bar_4.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_4.cpp"
```
===! "Plot"
[![example_bar_5](docs/examples/discrete_data/bar/bar_5.png)](examples/discrete_data/bar/bar_5.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_5.cpp"
```
===! "Plot"
[![example_bar_6](docs/examples/discrete_data/bar/bar_6.png)](examples/discrete_data/bar/bar_6.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_6.cpp"
```
===! "Plot"
[![example_bar_7](docs/examples/discrete_data/bar/bar_7.svg)](examples/discrete_data/bar/bar_7.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_7.cpp"
```
===! "Plot"
[![example_bar_8](docs/examples/discrete_data/bar/bar_8.png)](examples/discrete_data/bar/bar_8.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_8.cpp"
```
===! "Plot"
[![example_bar_9](docs/examples/discrete_data/bar/bar_9.png)](examples/discrete_data/bar/bar_9.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_9.cpp"
```
===! "Plot"
[![example_bar_10](docs/examples/discrete_data/bar/bar_10.png)](examples/discrete_data/bar/bar_10.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_10.cpp"
```
===! "Plot"
[![example_bar_11](docs/examples/discrete_data/bar/bar_11.png)](examples/discrete_data/bar/bar_11.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_11.cpp"
```
===! "Plot"
[![example_bar_12](docs/examples/discrete_data/bar/bar_12.png)](examples/discrete_data/bar/bar_12.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_12.cpp"
```
===! "Plot"
[![example_bar_13](docs/examples/discrete_data/bar/bar_13.png)](examples/discrete_data/bar/bar_13.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/bar/bar_13.cpp"
```
pareto(y);
===! "Plot"
[![example_pareto_1](docs/examples/discrete_data/pareto/pareto_1.svg)](examples/discrete_data/pareto/pareto_1.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/pareto/pareto_1.cpp"
```
More examples
===! "Plot"
[![example_pareto_2](docs/examples/discrete_data/pareto/pareto_2.svg)](examples/discrete_data/pareto/pareto_2.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/pareto/pareto_2.cpp"
```
===! "Plot"
[![example_pareto_3](docs/examples/discrete_data/pareto/pareto_3.svg)](examples/discrete_data/pareto/pareto_3.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/pareto/pareto_3.cpp"
```
===! "Plot"
[![example_pareto_4](docs/examples/discrete_data/pareto/pareto_4.svg)](examples/discrete_data/pareto/pareto_4.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/pareto/pareto_4.cpp"
```
Pareto Charts are a type of chart that uses both axes. The axis is used to represent bars with the data values in descending order. The axis is used to represent the cumulative distribution function of the data in the axis. By default, a Pareto Chart includes up to 10 items or as many items as needed to represent 95% of the cumulative distribution.
If you need Pareto fronts rather than Pareto charts, we refer to Scatter Plots for two-dimensional fronts, Plot matrices for three-dimensional fronts, or Parallel Coordinate Plots for many-objective fronts. These plot subcategories are described in Section Data Distribution. If you also need a tool to calculate these fronts efficiently, we refer to the Pareto Front Library.
stem(Y);
===! "Plot"
[![example_stem_1](docs/examples/discrete_data/stem/stem_1.svg)](examples/discrete_data/stem/stem_1.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_1.cpp"
```
More examples
===! "Plot"
[![example_stem_2](docs/examples/discrete_data/stem/stem_2.svg)](examples/discrete_data/stem/stem_2.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_2.cpp"
```
===! "Plot"
[![example_stem_3](docs/examples/discrete_data/stem/stem_3.svg)](examples/discrete_data/stem/stem_3.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_3.cpp"
```
===! "Plot"
[![example_stem_4](docs/examples/discrete_data/stem/stem_4.svg)](examples/discrete_data/stem/stem_4.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_4.cpp"
```
===! "Plot"
[![example_stem_5](docs/examples/discrete_data/stem/stem_5.svg)](examples/discrete_data/stem/stem_5.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_5.cpp"
```
===! "Plot"
[![example_stem_6](docs/examples/discrete_data/stem/stem_6.svg)](examples/discrete_data/stem/stem_6.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_6.cpp"
```
===! "Plot"
[![example_stem_7](docs/examples/discrete_data/stem/stem_7.svg)](examples/discrete_data/stem/stem_7.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_7.cpp"
```
===! "Plot"
[![example_stem_8](docs/examples/discrete_data/stem/stem_8.svg)](examples/discrete_data/stem/stem_8.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_8.cpp"
```
===! "Plot"
[![example_stem_9](docs/examples/discrete_data/stem/stem_9.svg)](examples/discrete_data/stem/stem_9.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem/stem_9.cpp"
```
stem3(z);
===! "Plot"
[![example_stem3_1](docs/examples/discrete_data/stem3/stem3_1.svg)](examples/discrete_data/stem3/stem3_1.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_1.cpp"
```
More examples
===! "Plot"
[![example_stem3_2](docs/examples/discrete_data/stem3/stem3_2.svg)](examples/discrete_data/stem3/stem3_2.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_2.cpp"
```
===! "Plot"
[![example_stem3_3](docs/examples/discrete_data/stem3/stem3_3.svg)](examples/discrete_data/stem3/stem3_3.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_3.cpp"
```
===! "Plot"
[![example_stem3_4](docs/examples/discrete_data/stem3/stem3_4.svg)](examples/discrete_data/stem3/stem3_4.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_4.cpp"
```
===! "Plot"
[![example_stem3_5](docs/examples/discrete_data/stem3/stem3_5.svg)](examples/discrete_data/stem3/stem3_5.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_5.cpp"
```
===! "Plot"
[![example_stem3_6](docs/examples/discrete_data/stem3/stem3_6.svg)](examples/discrete_data/stem3/stem3_6.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_6.cpp"
```
===! "Plot"
[![example_stem3_7](docs/examples/discrete_data/stem3/stem3_7.svg)](examples/discrete_data/stem3/stem3_7.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_7.cpp"
```
===! "Plot"
[![example_stem3_8](docs/examples/discrete_data/stem3/stem3_8.svg)](examples/discrete_data/stem3/stem3_8.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_8.cpp"
```
===! "Plot"
[![example_stem3_9](docs/examples/discrete_data/stem3/stem3_9.svg)](examples/discrete_data/stem3/stem3_9.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_9.cpp"
```
===! "Plot"
[![example_stem3_10](docs/examples/discrete_data/stem3/stem3_10.svg)](examples/discrete_data/stem3/stem3_10.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_10.cpp"
```
===! "Plot"
[![example_stem3_11](docs/examples/discrete_data/stem3/stem3_11.svg)](examples/discrete_data/stem3/stem3_11.cpp)
=== "C++"
```cpp
--8<-- "examples/discrete_data/stem3/stem3_11.cpp"
```
Geoplot | Geoscatter Plot | Geobubble | Geodensity Plot
geoplot(lat,lon);
===! "Plot"
[![example_geoplot_1](docs/examples/geography/geoplot/geoplot_1.png)](examples/geography/geoplot/geoplot_1.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoplot/geoplot_1.cpp"
```
More examples
===! "Plot"
[![example_geoplot_2](docs/examples/geography/geoplot/geoplot_2.png)](examples/geography/geoplot/geoplot_2.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoplot/geoplot_2.cpp"
```
===! "Plot"
[![example_geoplot_3](docs/examples/geography/geoplot/geoplot_3.png)](examples/geography/geoplot/geoplot_3.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoplot/geoplot_3.cpp"
```
===! "Plot"
[![example_geoplot_4](docs/examples/geography/geoplot/geoplot_4.png)](examples/geography/geoplot/geoplot_4.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoplot/geoplot_4.cpp"
```
===! "Plot"
[![example_geoplot_5](docs/examples/geography/geoplot/geoplot_5.png)](examples/geography/geoplot/geoplot_5.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoplot/geoplot_5.cpp"
```
===! "Plot"
[![example_geoplot_6](docs/examples/geography/geoplot/geoplot_6.png)](examples/geography/geoplot/geoplot_6.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoplot/geoplot_6.cpp"
```
===! "Plot"
[![example_geoplot_7](docs/examples/geography/geoplot/geoplot_7.png)](examples/geography/geoplot/geoplot_7.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoplot/geoplot_7.cpp"
```
For the first geography plot, Matplot++ calls geoplot()
, which creates a filled polygon with the world map. This first plot receives the tag "map"
so that subsequent geography plots recognize there is no need to recreate this world map.
The data for the world map comes from Natural Earth. They provide data at 1:10m, 1:50m, and 1:110m scales. The geoplot
function will initially use the data at the 1:110m scales. The geolimits
function can be used to update the axis limits for geography plots. The difference between the usual functions for adjusting axis limits (xlim
and ylim
) and geolimits
is that the latter will also update the map resolution according to the new limits for the and axis.
The geolimits
function will query the figure
size and, depending on the new limits for the axes, update the map to the 1:10m, or 1:50m scales if needed. Because it would be very inefficient to render the whole world map at a 1:10m or 1:50m scale only to display a region of this map, the geolimits
function also crops the data pertinent to the new region being displayed.
Note that this does not only involve removing data points outside the new limits but it also needs to create new data points on the correct borders to create new polygons coherent with the map entry points in the region. For this reason, the algorithm needs to track all submaps represented as closed polygons in the original world map. If submaps are completely inside or outside the new ranges, we can respectively include or dismiss the data points. However, if the submap is only partially inside the new limits, to generate the correct borders for the polygons, we need to track all points outside the limits to classify the directions of these points outside the limits. We do that by only including points that change quadrants around the new limits so that the map entry points create polygons that look like they would if the complete world map were still being rendered outside these new limits.
If the you are not interested in geographic plots, the build script includes an option to remove the high-resolution maps at 1:10m and 1:50m scales from the library. In this case, the library will always use the map at a 1:110m scale no matter the axis limits.
The function world_cities
returns a list of major world cities. Its parameters define the minimum distances between cities in the and axes. The greedy_tsp
function is a naive greedy algorithm to find a route between these cities as a Traveling Salesman Problem (TSP). We use the geoplot
function to draw this route. Note that we use method chaining to define some further plot properties. Finally, the text
function includes the city names in the map.
geoscatter(lat,lon);
===! "Plot"
[![example_geoscatter_1](docs/examples/geography/geoscatter/geoscatter_1.png)](examples/geography/geoscatter/geoscatter_1.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoscatter/geoscatter_1.cpp"
```
More examples
===! "Plot"
[![example_geoscatter_2](docs/examples/geography/geoscatter/geoscatter_2.png)](examples/geography/geoscatter/geoscatter_2.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geoscatter/geoscatter_2.cpp"
```
geobubble(lat,lon,sizes);
===! "Plot"
[![example_geobubble_1](docs/examples/geography/geobubble/geobubble_1.png)](examples/geography/geobubble/geobubble_1.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geobubble/geobubble_1.cpp"
```
More examples
===! "Plot"
[![example_geobubble_2](docs/examples/geography/geobubble/geobubble_2.png)](examples/geography/geobubble/geobubble_2.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geobubble/geobubble_2.cpp"
```
geodensityplot(lat, lon);
=== "Plot"
[![example_geodensityplot_1](docs/examples/geography/geodensityplot/geodensityplot_1.png)](examples/geography/geodensityplot/geodensityplot_1.cpp)
=== "C++"
```cpp
--8<-- "examples/geography/geodensityplot/geodensityplot_1.cpp"
```
Polar Line Plot | Polar Scatter Plot | Polar Histogram | Compass | Polar Function
polarplot(theta, rho);
===! "Plot"
[![example_polarplot_1](docs/examples/polar_plots/polarplot/polarplot_1.svg)](examples/polar_plots/polarplot/polarplot_1.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_1.cpp"
```
More examples
===! "Plot"
[![example_polarplot_2](docs/examples/polar_plots/polarplot/polarplot_2.svg)](examples/polar_plots/polarplot/polarplot_2.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_2.cpp"
```
===! "Plot"
[![example_polarplot_3](docs/examples/polar_plots/polarplot/polarplot_3.svg)](examples/polar_plots/polarplot/polarplot_3.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_3.cpp"
```
===! "Plot"
[![example_polarplot_4](docs/examples/polar_plots/polarplot/polarplot_4.svg)](examples/polar_plots/polarplot/polarplot_4.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_4.cpp"
```
===! "Plot"
[![example_polarplot_5](docs/examples/polar_plots/polarplot/polarplot_5.svg)](examples/polar_plots/polarplot/polarplot_5.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_5.cpp"
```
===! "Plot"
[![example_polarplot_6](docs/examples/polar_plots/polarplot/polarplot_6.svg)](examples/polar_plots/polarplot/polarplot_6.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_6.cpp"
```
===! "Plot"
[![example_polarplot_7](docs/examples/polar_plots/polarplot/polarplot_7.svg)](examples/polar_plots/polarplot/polarplot_7.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_7.cpp"
```
===! "Plot"
[![example_polarplot_8](docs/examples/polar_plots/polarplot/polarplot_8.svg)](examples/polar_plots/polarplot/polarplot_8.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarplot/polarplot_8.cpp"
```
By emplacing a polar plot in the axes
, the axes
move to a polar mode, where we use the and axis instead of the and axis.
From the backend point of view, these axes are an abstraction to the user. The data points in the and axis are drawn by converting the positions from the polar coordinates and to the Cartesian coordinates and with the relationships and .
Aside from this conversion, these plot subcategories are analogous to line plots, scatter plots, histograms, quiver plots, and line functions.
polarscatter(theta, rho);
===! "Plot"
[![example_polarscatter_1](docs/examples/polar_plots/polarscatter/polarscatter_1.svg)](examples/polar_plots/polarscatter/polarscatter_1.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarscatter/polarscatter_1.cpp"
```
More examples
===! "Plot"
[![example_polarscatter_2](docs/examples/polar_plots/polarscatter/polarscatter_2.svg)](examples/polar_plots/polarscatter/polarscatter_2.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarscatter/polarscatter_2.cpp"
```
===! "Plot"
[![example_polarscatter_3](docs/examples/polar_plots/polarscatter/polarscatter_3.svg)](examples/polar_plots/polarscatter/polarscatter_3.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarscatter/polarscatter_3.cpp"
```
===! "Plot"
[![example_polarscatter_4](docs/examples/polar_plots/polarscatter/polarscatter_4.svg)](examples/polar_plots/polarscatter/polarscatter_4.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarscatter/polarscatter_4.cpp"
```
===! "Plot"
[![example_polarscatter_5](docs/examples/polar_plots/polarscatter/polarscatter_5.svg)](examples/polar_plots/polarscatter/polarscatter_5.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarscatter/polarscatter_5.cpp"
```
===! "Plot"
[![example_polarscatter_6](docs/examples/polar_plots/polarscatter/polarscatter_6.svg)](examples/polar_plots/polarscatter/polarscatter_6.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarscatter/polarscatter_6.cpp"
```
polarhistogram(theta, 6);
===! "Plot"
[![example_polarhistogram_1](docs/examples/polar_plots/polarhistogram/polarhistogram_1.svg)](examples/polar_plots/polarhistogram/polarhistogram_1.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarhistogram/polarhistogram_1.cpp"
```
More examples
===! "Plot"
[![example_polarhistogram_2](docs/examples/polar_plots/polarhistogram/polarhistogram_2.svg)](examples/polar_plots/polarhistogram/polarhistogram_2.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarhistogram/polarhistogram_2.cpp"
```
===! "Plot"
[![example_polarhistogram_3](docs/examples/polar_plots/polarhistogram/polarhistogram_3.svg)](examples/polar_plots/polarhistogram/polarhistogram_3.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarhistogram/polarhistogram_3.cpp"
```
===! "Plot"
[![example_polarhistogram_4](docs/examples/polar_plots/polarhistogram/polarhistogram_4.svg)](examples/polar_plots/polarhistogram/polarhistogram_4.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarhistogram/polarhistogram_4.cpp"
```
===! "Plot"
[![example_polarhistogram_5](docs/examples/polar_plots/polarhistogram/polarhistogram_5.svg)](examples/polar_plots/polarhistogram/polarhistogram_5.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/polarhistogram/polarhistogram_5.cpp"
```
The function polarhistogram
distributes the data into the number of bins provided as its second parameter.
compass(u, v);
===! "Plot"
[![example_compass_1](docs/examples/polar_plots/compass/compass_1.svg)](examples/polar_plots/compass/compass_1.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/compass/compass_1.cpp"
```
More examples
===! "Plot"
[![example_compass_2](docs/examples/polar_plots/compass/compass_2.svg)](examples/polar_plots/compass/compass_2.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/compass/compass_2.cpp"
```
ezpolar(fn);
===! "Plot"
[![example_ezpolar_1](docs/examples/polar_plots/ezpolar/ezpolar_1.svg)](examples/polar_plots/ezpolar/ezpolar_1.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/ezpolar/ezpolar_1.cpp"
```
More examples
===! "Plot"
[![example_ezpolar_2](docs/examples/polar_plots/ezpolar/ezpolar_2.svg)](examples/polar_plots/ezpolar/ezpolar_2.cpp)
=== "C++"
```cpp
--8<-- "examples/polar_plots/ezpolar/ezpolar_2.cpp"
```
Contour | Filled Contour | Function Contour
contour(X, Y, Z);
===! "Plot"
[![example_contour_1](docs/examples/contour_plots/contour/contour_1.svg)](examples/contour_plots/contour/contour_1.cpp)
=== "C++"
```cpp
--8<-- "examples/contour_plots/contour/contour_1.cpp"
```
More examples
===! "Plot"
[![example_contour_2](docs/examples/contour_plots/contour/contour_2.svg)](examples/contour_plots/contour/contour_2.cpp)
=== "C++"
```cpp
--8<-- "examples/contour_plots/contour/contour_2.cpp"
```
===! "Plot"