[matplotlib/modpyplot.cpp] Added support for third parameter color in plot function

It is now possible to specify the color of the plot through a third positional argument in the plot function. However, is a keyword (color or c) is then used, it will override the previous color command.

Change-Id: I5a73ddb322e650db486de568e4a56b4752751cfb
(cherry picked from commit e6cc196cca405e5a4f8058a6af917aa0e7962b8a)
This commit is contained in:
Arthur Camouseigt
2020-05-26 10:27:12 +02:00
committed by Émilie Feral
parent 4b88521e14
commit e1a356fe88

View File

@@ -52,11 +52,13 @@ static size_t extractArgumentAndValidateSize(mp_obj_t arg, size_t requiredlength
// Get color from keyword arguments if possible
KDColor colorFromKeywordArgument(mp_map_elem_t * elemColor) {
bool colorFromKeywordArgument(mp_map_elem_t * elemColor, KDColor * color) {
if (elemColor != nullptr) {
return MicroPython::Color::Parse(elemColor->value);
*color = MicroPython::Color::Parse(elemColor->value);
return true;
} else {
return Palette::nextDataColor(&paletteIndex);
*color = Palette::nextDataColor(&paletteIndex);
return false;
}
}
@@ -108,9 +110,10 @@ mp_obj_t modpyplot_arrow(size_t n_args, const mp_obj_t *args, mp_map_t* kw_args)
mp_obj_t arrowWidth = (elem == nullptr) ? mp_obj_new_float(0.003) : elem->value;
// Setting arrow color
KDColor color;
// color keyword
elem = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_color), MP_MAP_LOOKUP);
KDColor color = colorFromKeywordArgument(elem);
colorFromKeywordArgument(elem, &color);
// Adding the object to the plot
sPlotStore->addSegment(args[0], args[1], mp_obj_new_float(mp_obj_get_float(args[0]) + mp_obj_get_float(args[2])), mp_obj_new_float(mp_obj_get_float(args[1]) + mp_obj_get_float(args[3])), color, arrowWidth);
@@ -212,8 +215,10 @@ mp_obj_t modpyplot_bar(size_t n_args, const mp_obj_t *args, mp_map_t* kw_args) {
// Setting bar color
// color keyword
KDColor color;
// color keyword
mp_map_elem_t * elem = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_color), MP_MAP_LOOKUP);
KDColor color = colorFromKeywordArgument(elem);
colorFromKeywordArgument(elem, &color);
for (size_t i=0; i<xLength; i++) {
mp_obj_t iH = hItems[hLength > 1 ? i : 0];
@@ -333,8 +338,10 @@ mp_obj_t modpyplot_hist(size_t n_args, const mp_obj_t *args, mp_map_t* kw_args )
// Setting hist color
// color keyword
KDColor color;
// color keyword
mp_map_elem_t * elem = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_color), MP_MAP_LOOKUP);
KDColor color = colorFromKeywordArgument(elem);
colorFromKeywordArgument(elem, &color);
for (size_t i=0; i<nBins; i++) {
sPlotStore->addRect(edgeItems[i], edgeItems[i+1], binItems[i], mp_obj_new_float(0.0), color);
@@ -358,12 +365,14 @@ mp_obj_t modpyplot_scatter(size_t n_args, const mp_obj_t *args, mp_map_t* kw_arg
size_t length = extractArgumentsAndCheckEqualSize(args[0], args[1], &xItems, &yItems);
// Setting scatter color
// color keyword
KDColor color;
// c keyword
mp_map_elem_t * elem = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_c), MP_MAP_LOOKUP);
KDColor color = colorFromKeywordArgument(elem);
colorFromKeywordArgument(elem, &color);
// color keyword
elem = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_color), MP_MAP_LOOKUP);
color = colorFromKeywordArgument(elem);
colorFromKeywordArgument(elem, &color);
for (size_t i=0; i<length; i++) {
sPlotStore->addDot(xItems[i], yItems[i], color);
@@ -378,9 +387,6 @@ mp_obj_t modpyplot_scatter(size_t n_args, const mp_obj_t *args, mp_map_t* kw_arg
mp_obj_t modpyplot_plot(size_t n_args, const mp_obj_t *args,mp_map_t* kw_args) {
assert(sPlotStore != nullptr);
if (n_args > 2) {
mp_raise_TypeError("plot() takes 2 positional arguments");
}
sPlotStore->setShow(true);
mp_obj_t * xItems, * yItems;
size_t length;
@@ -398,12 +404,18 @@ mp_obj_t modpyplot_plot(size_t n_args, const mp_obj_t *args,mp_map_t* kw_args) {
}
// Setting plot color
KDColor color;
bool isUserSet = false;
// c keyword
mp_map_elem_t * elem = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_c), MP_MAP_LOOKUP);
KDColor color = colorFromKeywordArgument(elem);
isUserSet = colorFromKeywordArgument(elem, &color);
// color keyword
elem = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_color), MP_MAP_LOOKUP);
color = colorFromKeywordArgument(elem);
isUserSet = isUserSet | colorFromKeywordArgument(elem, &color);
// Eventual third positional argument
if (!isUserSet && n_args >= 3) {
color = MicroPython::Color::Parse(args[2]);
}
for (int i=0; i<(int)length-1; i++) {
sPlotStore->addSegment(xItems[i], yItems[i], xItems[i+1], yItems[i+1], color);