import numpy as np from scipy import optimize metrics = GC.activityMetrics(compare=True) n_activities = len(metrics) def piecewise_linear(x, x0, y0, k1, k2): def fun0(x): k1 * x + y0 - k1 * x0 def fun1(x): k2 * x + y0 - k2 * x0 return np.piecewise(x, [x < x0], [fun0, fun1]) GC.setChart( title="Lactate-Ramp", type=GC.CHART_LINE, animate=False, legpos=GC_ALIGN_TOP, stack=False, ) for i, metric in enumerate(metrics): date = metric[0]["date"] color = metric[1] print(color) x = list(GC.xdataSeries("Lactate-Ramp", "Power", compareindex=i)) y = list(GC.xdataSeries("Lactate-Ramp", "Lactate", compareindex=i)) if not (x and y): continue GC.addCurve( name=str(date), x=x, y=y, xaxis="Power", yaxis="Lactate", color=color, line=GC_LINE_SOLID, symbol=GC_SYMBOL_CIRCLE, size=3, opacity=100, opengl=False, ) coeffs = np.polyfit(x, y, 3) poly = np.poly1d(coeffs) x_poly = np.linspace(x[0], x[-1], 51) y_poly = poly(x_poly) GC.addCurve( name="Fit", x=x_poly, y=y_poly, xaxis="Power", yaxis="Lactate", color=color, line=GC_LINE_DASH, symbol=GC_SYMBOL_NONE, size=3, opacity=100, opengl=False, ) x_poly = np.linspace(x[0], x[-2], 51) x_poly = np.array(x) y_poly = poly(x_poly) p, e = optimize.curve_fit(piecewise_linear, np.log(x_poly), np.log(y_poly), p0=[np.mean(x_poly), np.mean(y_poly), 0, 0]) # p, e = optimize.curve_fit(piecewise_linear, x_poly, y_poly) print(p) GC.addCurve( name="log-log", x=x_poly, y=piecewise_linear(x_poly, *p), xaxis="Power", yaxis="Lactate", line=GC_LINE_DASH, symbol=GC_SYMBOL_NONE, size=1, opacity=100, opengl=False, ) print(piecewise_linear(x_poly, *p)) GC.setAxis("Power", min=90, max=350, type=GC.AXIS_CONTINUOUS) GC.setAxis("Lactate", min=0.0, max=10.0, type=GC.AXIS_CONTINUOUS)