Private
Public Access
1
0
Files
rowsandall/rowers/plots.py
Sander Roosendaal a547e851be more pep
2022-02-17 15:16:27 +01:00

100 lines
2.7 KiB
Python

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