@@ -51,6 +51,8 @@ struct _interpreter {
51
51
PyObject *s_python_function_axis;
52
52
PyObject *s_python_function_xlabel;
53
53
PyObject *s_python_function_ylabel;
54
+ PyObject *s_python_function_xticks;
55
+ PyObject *s_python_function_yticks;
54
56
PyObject *s_python_function_grid;
55
57
PyObject *s_python_function_clf;
56
58
PyObject *s_python_function_errorbar;
@@ -149,6 +151,8 @@ struct _interpreter {
149
151
s_python_function_axis = PyObject_GetAttrString (pymod, " axis" );
150
152
s_python_function_xlabel = PyObject_GetAttrString (pymod, " xlabel" );
151
153
s_python_function_ylabel = PyObject_GetAttrString (pymod, " ylabel" );
154
+ s_python_function_xticks = PyObject_GetAttrString (pymod, " xticks" );
155
+ s_python_function_yticks = PyObject_GetAttrString (pymod, " yticks" );
152
156
s_python_function_grid = PyObject_GetAttrString (pymod, " grid" );
153
157
s_python_function_xlim = PyObject_GetAttrString (pymod, " xlim" );
154
158
s_python_function_ion = PyObject_GetAttrString (pymod, " ion" );
@@ -849,6 +853,100 @@ inline double* ylim()
849
853
return arr;
850
854
}
851
855
856
+ template <typename Numeric>
857
+ inline void xticks (const std::vector<Numeric> &ticks, const std::vector<std::string> &labels = {}, const std::map<std::string, std::string>& keywords = {})
858
+ {
859
+ assert (labels.size () == 0 || ticks.size () == labels.size ());
860
+
861
+ // using numpy array
862
+ PyObject* ticksarray = get_array (ticks);
863
+
864
+ PyObject* args;
865
+ if (labels.size () == 0 ) {
866
+ // construct positional args
867
+ args = PyTuple_New (1 );
868
+ PyTuple_SetItem (args, 0 , ticksarray);
869
+ } else {
870
+ // make tuple of tick labels
871
+ PyObject* labelstuple = PyTuple_New (labels.size ());
872
+ for (size_t i = 0 ; i < labels.size (); i++)
873
+ PyTuple_SetItem (labelstuple, i, PyUnicode_FromString (labels[i].c_str ()));
874
+
875
+ // construct positional args
876
+ args = PyTuple_New (2 );
877
+ PyTuple_SetItem (args, 0 , ticksarray);
878
+ PyTuple_SetItem (args, 1 , labelstuple);
879
+ }
880
+
881
+ // construct keyword args
882
+ PyObject* kwargs = PyDict_New ();
883
+ for (std::map<std::string, std::string>::const_iterator it = keywords.begin (); it != keywords.end (); ++it)
884
+ {
885
+ PyDict_SetItemString (kwargs, it->first .c_str (), PyString_FromString (it->second .c_str ()));
886
+ }
887
+
888
+ PyObject* res = PyObject_Call (detail::_interpreter::get ().s_python_function_xticks , args, kwargs);
889
+
890
+ Py_DECREF (args);
891
+ Py_DECREF (kwargs);
892
+ if (!res) throw std::runtime_error (" Call to xticks() failed" );
893
+
894
+ Py_DECREF (res);
895
+ }
896
+
897
+ template <typename Numeric>
898
+ inline void xticks (const std::vector<Numeric> &ticks, const std::map<std::string, std::string>& keywords)
899
+ {
900
+ xticks (ticks, {}, keywords);
901
+ }
902
+
903
+ template <typename Numeric>
904
+ inline void yticks (const std::vector<Numeric> &ticks, const std::vector<std::string> &labels = {}, const std::map<std::string, std::string>& keywords = {})
905
+ {
906
+ assert (labels.size () == 0 || ticks.size () == labels.size ());
907
+
908
+ // using numpy array
909
+ PyObject* ticksarray = get_array (ticks);
910
+
911
+ PyObject* args;
912
+ if (labels.size () == 0 ) {
913
+ // construct positional args
914
+ args = PyTuple_New (1 );
915
+ PyTuple_SetItem (args, 0 , ticksarray);
916
+ } else {
917
+ // make tuple of tick labels
918
+ PyObject* labelstuple = PyTuple_New (labels.size ());
919
+ for (size_t i = 0 ; i < labels.size (); i++)
920
+ PyTuple_SetItem (labelstuple, i, PyUnicode_FromString (labels[i].c_str ()));
921
+
922
+ // construct positional args
923
+ args = PyTuple_New (2 );
924
+ PyTuple_SetItem (args, 0 , ticksarray);
925
+ PyTuple_SetItem (args, 1 , labelstuple);
926
+ }
927
+
928
+ // construct keyword args
929
+ PyObject* kwargs = PyDict_New ();
930
+ for (std::map<std::string, std::string>::const_iterator it = keywords.begin (); it != keywords.end (); ++it)
931
+ {
932
+ PyDict_SetItemString (kwargs, it->first .c_str (), PyString_FromString (it->second .c_str ()));
933
+ }
934
+
935
+ PyObject* res = PyObject_Call (detail::_interpreter::get ().s_python_function_yticks , args, kwargs);
936
+
937
+ Py_DECREF (args);
938
+ Py_DECREF (kwargs);
939
+ if (!res) throw std::runtime_error (" Call to yticks() failed" );
940
+
941
+ Py_DECREF (res);
942
+ }
943
+
944
+ template <typename Numeric>
945
+ inline void yticks (const std::vector<Numeric> &ticks, const std::map<std::string, std::string>& keywords)
946
+ {
947
+ yticks (ticks, {}, keywords);
948
+ }
949
+
852
950
inline void subplot (long nrows, long ncols, long plot_number)
853
951
{
854
952
// construct positional args
0 commit comments