From 2362150297dd951a6516b1b869c2e4cc87f5fbc5 Mon Sep 17 00:00:00 2001 From: jensaly Date: Sun, 22 May 2022 21:53:48 +0200 Subject: [PATCH] Added polar function and example. --- CMakeLists.txt | 4 ++ examples/polar.cpp | 18 ++++++ examples/polar.png | Bin 0 -> 49329 bytes matplotlibcpp.h | 150 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 examples/polar.cpp create mode 100644 examples/polar.png diff --git a/CMakeLists.txt b/CMakeLists.txt index bb2decd..d690f85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,10 @@ add_executable(lines3d examples/lines3d.cpp) target_link_libraries(lines3d PRIVATE matplotlib_cpp) set_target_properties(lines3d PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +add_executable(polar examples/polar.cpp) +target_link_libraries(polar PRIVATE matplotlib_cpp) +set_target_properties(polar PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + if(Python3_NumPy_FOUND) add_executable(surface examples/surface.cpp) target_link_libraries(surface PRIVATE matplotlib_cpp) diff --git a/examples/polar.cpp b/examples/polar.cpp new file mode 100644 index 0000000..815cc2c --- /dev/null +++ b/examples/polar.cpp @@ -0,0 +1,18 @@ +#include "../matplotlibcpp.h" + +namespace plt = matplotlibcpp; + +int main() { + std::vector r, th; + for (int i = 0; i < 201; i++) { + r.push_back(0 + 0.01 * i); + th.push_back(2 * M_PI * r.back()); + } + plt::polar(th, r, {{"color", "red"}}); + std::vector ticks {0.5, 0.75, 1.0}; + plt::set_rticks(ticks); + plt::set_rmax(2.0); + plt::set_rlabel_position(90.0); + plt::title("Polar plot"); + plt::show(); +} diff --git a/examples/polar.png b/examples/polar.png new file mode 100644 index 0000000000000000000000000000000000000000..c5154f0a349863b3ff41bed8118ac76980f31e87 GIT binary patch literal 49329 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 literal 0 HcmV?d00001 diff --git a/matplotlibcpp.h b/matplotlibcpp.h index d95d46a..c127829 100644 --- a/matplotlibcpp.h +++ b/matplotlibcpp.h @@ -103,6 +103,9 @@ struct _interpreter { PyObject *s_python_function_subplots_adjust; PyObject *s_python_function_rcparams; PyObject *s_python_function_spy; + PyObject *s_python_function_set_rticks; + PyObject *s_python_function_set_rmax; + PyObject *s_python_function_gcf; /* For now, _interpreter is implemented as a singleton since its currently not possible to have multiple independent embedded python interpreters without patching the python source code @@ -277,7 +280,10 @@ struct _interpreter { s_python_function_colorbar = PyObject_GetAttrString(pymod, "colorbar"); s_python_function_subplots_adjust = safe_import(pymod,"subplots_adjust"); s_python_function_rcparams = PyObject_GetAttrString(pymod, "rcParams"); - s_python_function_spy = PyObject_GetAttrString(pymod, "spy"); + s_python_function_spy = PyObject_GetAttrString(pymod, "spy"); + s_python_function_set_rticks = safe_import(pymod, "yticks"); + s_python_function_set_rmax = safe_import(pymod, "ylim"); + s_python_function_gcf = safe_import(pymod, "gcf"); #ifndef WITHOUT_NUMPY s_python_function_imshow = safe_import(pymod, "imshow"); #endif @@ -1806,6 +1812,148 @@ bool named_loglog(const std::string& name, const std::vector& x, const return res; } +template +inline void set_rticks(const std::vector &ticks, const std::vector &labels = {}, const std::map& keywords = {}) +{ + assert(labels.size() == 0 || ticks.size() == labels.size()); + + detail::_interpreter::get(); + + // using numpy array + PyObject* ticksarray = detail::get_array(ticks); + + PyObject* args; + if(labels.size() == 0) { + // construct positional args + args = PyTuple_New(1); + PyTuple_SetItem(args, 0, ticksarray); + } else { + // make tuple of tick labels + PyObject* labelstuple = PyTuple_New(labels.size()); + for (size_t i = 0; i < labels.size(); i++) + PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str())); + + // construct positional args + args = PyTuple_New(2); + PyTuple_SetItem(args, 0, ticksarray); + PyTuple_SetItem(args, 1, labelstuple); + } + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_set_rticks, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + if(!res) throw std::runtime_error("Call to set_rticks() failed"); + + Py_DECREF(res); +} + +template +void set_rmax(Numeric right) +{ + detail::_interpreter::get(); + + PyObject* list = PyList_New(2); + PyList_SetItem(list, 0, PyFloat_FromDouble(0)); + PyList_SetItem(list, 1, PyFloat_FromDouble(right)); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, list); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_set_rmax, args); + if(!res) throw std::runtime_error("Call to set_rmax() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +template +void set_rlabel_position(Numeric value) +{ + detail::_interpreter::get(); + // using gcf to get the figure + PyObject* fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_gcf, detail::_interpreter::get().s_python_empty_tuple); + if (!fig) throw std::runtime_error("Call to figure() failed."); + + PyObject *gca_kwargs = PyDict_New(); + PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("polar")); + // then gca to get the polar axis + PyObject *gca = PyObject_GetAttrString(fig, "gca"); + if (!gca) throw std::runtime_error("No gca"); + Py_INCREF(gca); + PyObject *axis = PyObject_Call( + gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); + PyObject_CallMethod(axis, "set_rlabel_position", "f", value); + if (!axis) throw std::runtime_error("No axis"); + Py_DECREF(gca); +} + +template +bool polar(const std::vector& x, const std::vector& y, const std::map& keywords = {}) +{ + assert(x.size() == y.size()); + + //set up parameters + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* plot_args = PyTuple_New(2); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject *fig = + PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, + detail::_interpreter::get().s_python_empty_tuple); + if (!fig) throw std::runtime_error("Call to figure() failed."); + + // getting gca to do polar projection + PyObject *gca_kwargs = PyDict_New(); + PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("polar")); + + PyObject *gca = PyObject_GetAttrString(fig, "gca"); + if (!gca) throw std::runtime_error("No gca"); + Py_INCREF(gca); + PyObject *axis = PyObject_Call( + gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); + if (!axis) throw std::runtime_error("No axis"); + + Py_INCREF(axis); + + Py_DECREF(gca); + Py_DECREF(gca_kwargs); + + // plot + PyObject *polar = PyObject_GetAttrString(axis, "plot"); + if (!polar) throw std::runtime_error("No line plot"); + Py_INCREF(polar); + PyObject* res = PyObject_Call(polar, plot_args, kwargs); + if (!res) throw std::runtime_error("Failed polar plot"); + Py_DECREF(polar); + Py_DECREF(axis); + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) + Py_DECREF(res); + + return res; +} + template bool plot(const std::vector& y, const std::string& format = "") {