Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Extremely simple yet powerful header-only C++ plotting library built on the popular matplotlib

License

MIT, Unknown licenses found

Licenses found

MIT
LICENSE
Unknown
LICENSE.matplotlib
NotificationsYou must be signed in to change notification settings

lava/matplotlib-cpp

Repository files navigation

Welcome to matplotlib-cpp, possibly the simplest C++ plotting library.It is built to resemble the plotting API used by Matlab and matplotlib.

Usage

Complete minimal example:

#include"matplotlibcpp.h"namespaceplt= matplotlibcpp;intmain() {plt::plot({1,3,2,4});plt::show();}
g++ minimal.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7

Result:

Minimal example

A more comprehensive example:

#include"matplotlibcpp.h"#include<cmath>namespaceplt= matplotlibcpp;intmain(){// Prepare data.int n =5000;    std::vector<double>x(n),y(n),z(n),w(n,2);for(int i=0; i<n; ++i) {        x.at(i) = i*i;        y.at(i) =sin(2*M_PI*i/360.0);        z.at(i) =log(i);    }// Set the size of output image to 1200x780 pixelsplt::figure_size(1200,780);// Plot line from given x and y data. Color is selected automatically.plt::plot(x, y);// Plot a red dashed line from given x and y data.plt::plot(x, w,"r--");// Plot a line whose name will show up as "log(x)" in the legend.plt::named_plot("log(x)", x, z);// Set x-axis to interval [0,1000000]plt::xlim(0,1000*1000);// Add graph titleplt::title("Sample figure");// Enable legend.plt::legend();// Save the image (file format is determined by the extension)plt::save("./basic.png");}
g++ basic.cpp -I/usr/include/python2.7 -lpython2.7

Result:

Basic example

Alternatively, matplotlib-cpp also supports some C++11-powered syntactic sugar:

#include<cmath>#include"matplotlibcpp.h"usingnamespacestd;namespaceplt= matplotlibcpp;intmain(){// Prepare data.int n =5000;// number of data points    vector<double>x(n),y(n);for(int i=0; i<n; ++i) {double t =2*M_PI*i/n;        x.at(i) =16*sin(t)*sin(t)*sin(t);        y.at(i) =13*cos(t) -5*cos(2*t) -2*cos(3*t) -cos(4*t);    }// plot() takes an arbitrary number of (x,y,format)-triples.// x must be iterable (that is, anything providing begin(x) and end(x)),// y must either be callable (providing operator() const) or iterable.plt::plot(x, y,"r-", x, [](double d) {return12.5+abs(sin(d)); },"k-");// show plotsplt::show();}
g++ modern.cpp -std=c++11 -I/usr/include/python2.7 -lpython

Result:

Modern example

Or somefunny-looking xkcd-styled example:

#include"matplotlibcpp.h"#include<vector>#include<cmath>namespaceplt= matplotlibcpp;intmain() {    std::vector<double>t(1000);    std::vector<double>x(t.size());for(size_t i =0; i < t.size(); i++) {        t[i] = i /100.0;        x[i] =sin(2.0 * M_PI *1.0 * t[i]);    }plt::xkcd();plt::plot(t, x);plt::title("AN ORDINARY SIN WAVE");plt::save("xkcd.png");}
g++ xkcd.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7

Result:

xkcd example

When working with vector fields, you might be interested in quiver plots:

#include"../matplotlibcpp.h"namespaceplt= matplotlibcpp;intmain(){// u and v are respectively the x and y components of the arrows we're plotting    std::vector<int> x, y, u, v;for (int i = -5; i <=5; i++) {for (int j = -5; j <=5; j++) {            x.push_back(i);            u.push_back(-i);            y.push_back(j);            v.push_back(-j);        }    }plt::quiver(x, y, u, v);plt::show();}
g++ quiver.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7

Result:

quiver example

When working with 3d functions, you might be interested in 3d plots:

#include"../matplotlibcpp.h"namespaceplt= matplotlibcpp;intmain(){    std::vector<std::vector<double>> x, y, z;for (double i = -5; i <=5;  i +=0.25) {        std::vector<double> x_row, y_row, z_row;for (double j = -5; j <=5; j +=0.25) {            x_row.push_back(i);            y_row.push_back(j);            z_row.push_back(::std::sin(::std::hypot(i, j)));        }        x.push_back(x_row);        y.push_back(y_row);        z.push_back(z_row);    }plt::plot_surface(x, y, z);plt::show();}

Result:

surface example

Installation

matplotlib-cpp works by wrapping the popular python plotting library matplotlib. (matplotlib.org)This means you have to have a working python installation, including development headers.On Ubuntu:

sudo apt-get install python-matplotlib python-numpy python2.7-dev

If, for some reason, you're unable to get a working installation of numpy on your system,you can define the macroWITHOUT_NUMPY before including the header file to erase thisdependency.

The C++-part of the library consists of the single header filematplotlibcpp.h whichcan be placed anywhere.

Since a python interpreter is opened internally, it is necessary to linkagainstlibpython in order to user matplotlib-cpp. Most versions shouldwork, although python likes to randomly break compatibility from time to timeso some caution is advised when using the bleeding edge.

CMake

The C++ code is compatible to both python2 and python3. However, theCMakeLists.txtfile is currently set up to use python3 by default, so if python2 is required thishas to be changed manually. (a PR that adds a cmake option for this would be highlywelcomed)

NOTE: By design (of python), only a single python interpreter can be created perprocess. When using this library,no other library that is spawning a pythoninterpreter internally can be used.

To compile the code without using cmake, the compiler invocation should look likethis:

g++ example.cpp -I/usr/include/python2.7 -lpython2.7

This can also be used for linking against a custom build of python

g++ example.cpp -I/usr/local/include/fancy-python4 -L/usr/local/lib -lfancy-python4

Vcpkg

You can download and install matplotlib-cpp using thevcpkg dependency manager:

git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh./vcpkg integrate installvcpkg install matplotlib-cpp

The matplotlib-cpp port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, pleasecreate an issue or pull request on the vcpkg repository.

C++11

Currently, c++11 is required to build matplotlib-cpp. The last working commit that didnot have this requirement was717e98e752260245407c5329846f5d62605eff08.

Note that support for c++98 was dropped more or less accidentally, so if you have to workwith an ancient compiler and still want to enjoy the latest additional features, I'dprobably merge a PR that restores support.

Why?

I initially started this library during my diploma thesis. The usual approach ofwriting data from the c++ algorithm to a file and afterwards parsing and plottingit in python using matplotlib proved insufficient: Keeping the algorithmand plotting code in sync requires a lot of effort when the C++ code frequently and substantiallychanges. Additionally, the python yaml parser was not able to cope with files thatexceed a few hundred megabytes in size.

Therefore, I was looking for a C++ plotting library that was extremely easy to useand to add into an existing codebase, preferably header-only. When I foundnone, I decided to write one myself, which is basically a C++ wrapper aroundmatplotlib. As you can see from the above examples, plotting data and saving itto an image file can be done as few as two lines of code.

The general approach of providing a simple C++ API for utilizing python codewas later generalized and extracted into a separate, more powerfullibrary in another project of mine,wrappy.

Todo/Issues/Wishlist

  • This library is not thread safe. Protect all concurrent access with a mutex.Sadly, this is not easy to fix since it is not caused by the library itself butby the python interpreter, which is itself not thread-safe.

  • It would be nice to have a more object-oriented design with a Plot class which would allowmultiple independent plots per program.

  • Right now, only a small subset of matplotlibs functionality is exposed. Stuff like xlabel()/ylabel() etc. shouldbe easy to add.

  • If you use Anaconda on Windows, you might need to set PYTHONHOME to Anaconda home directory and QT_QPA_PLATFORM_PLUGIN_PATH to %PYTHONHOME%Library/plugins/platforms. The latter is for especially when you get the error which says 'This application failed to start because it could not find or load the Qt platform plugin "windows"in "".'

  • MacOS:Unable to import matplotlib.pyplot. Cause: In mac os image rendering back end of matplotlib (what-is-a-backend to render using the API of Cocoa by default). There is Qt4Agg and GTKAgg and as a back-end is not the default. Set the back end of macosx that is differ compare with other windows or linux os.Solution is describedhere, additional information can be found there too(see links in answers).

About

Extremely simple yet powerful header-only C++ plotting library built on the popular matplotlib

Resources

License

MIT, Unknown licenses found

Licenses found

MIT
LICENSE
Unknown
LICENSE.matplotlib

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp