from matplotlib.ticker import MultipleLocator, FuncFormatter, NullFormatter import matplotlib.pyplot as plt import numpy as np from rowers.rows import format_pace_tick, format_pace, format_time, format_time_tick # Formatting the distance tick marks # def format_dist_tick(x,pos=None): # km = x/1000. # template='%6.3f' # return template % (km) # Utility to select reasonable y axis range # Basically the data range plus some padding, but with ultimate # you can set the slowest paces to fall off the axis. # Useful for OTW rowing where you sometimes stops and pace runs out of # the boundaries def y_axis_range(ydata, miny=0, padding=.1, ultimate=[-1e9, 1e9]): # ydata must by a numpy array ymin = np.ma.masked_invalid(ydata).min() ymax = np.ma.masked_invalid(ydata).max() yrange = ymax-ymin yrangemin = ymin yrangemax = ymax if (yrange == 0): # pragma: no cover if ymin == 0: yrangemin = -padding else: yrangemin = ymin-ymin*padding if ymax == 0: yrangemax = padding else: yrangemax = ymax+ymax*padding else: yrangemin = ymin-padding*yrange yrangemax = ymax+padding*yrange if (yrangemin < ultimate[0]): # pragma: no cover yrangemin = ultimate[0] if (yrangemax > ultimate[1]): yrangemax = ultimate[1] return [yrangemin, yrangemax] # Make a plot (this one is only used for testing) def mkplot(row, title): df = row.df t = df.loc[:, ' ElapsedTime (sec)'].values p = df.loc[:, ' Stroke500mPace (sec/500m)'].values hr = df.loc[:, ' HRCur (bpm)'].values end_time = int(df.loc[:, 'TimeStamp (sec)'].iloc[df.shape[0]-1]) fig, ax1 = plt.subplots(figsize=(5, 4)) ax1.plot(t, p, 'b-') ax1.set_xlabel('Time (h:m)') ax1.set_ylabel('(sec/500)') yrange = y_axis_range(df.loc[:, ' Stroke500mPace (sec/500m)'], ultimate=[85, 190]) plt.axis([0, end_time, yrange[1], yrange[0]]) ax1.set_xticks(range(1000, end_time, 1000)) ax1.set_yticks(range(185, 90, -10)) ax1.set_title(title) plt.grid(True) majorFormatter = FuncFormatter(format_pace_tick) # majorLocator = (5) # timeTickFormatter = NullFormatter() ax1.yaxis.set_major_formatter(majorFormatter) for tl in ax1.get_yticklabels(): tl.set_color('b') ax2 = ax1.twinx() ax2.plot(t, hr, 'r-') ax2.set_ylabel('Heart Rate', color='r') majorTimeFormatter = FuncFormatter(format_time_tick) # majorLocator = (15*60) ax2.xaxis.set_major_formatter(majorTimeFormatter) ax2.patch.set_alpha(0.0) for tl in ax2.get_yticklabels(): tl.set_color('r') plt.subplots_adjust(hspace=0) return fig