#!/usr/bin/env python import argparse import datetime import sys import gpx_parser import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy import os MONTH_LABELS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] def parse_args(): '''Shell argument parser.''' parser = argparse.ArgumentParser() parser.add_argument('infolder', help='Specify the in folder.') parser.add_argument('outfolder', help='Specify the out folder.') return parser.parse_args() def plot_bar_chart(labels, ticklabels, values, title, xlabel, ylabel, filename): fig = plt.figure() ax1 = fig.add_subplot(111) ax1.grid(zorder=0) plt.title(title) plt.xlabel(xlabel) plt.ylabel(ylabel) width = 1.0 / len(values) - 0.025 x_base = numpy.arange(12) x_pos = list() for i in range(len(values)): x_pos.append([x + (width / 2) + i * width for x in range(len(x_base))]) plt.bar(x_pos[i], values[i], width=width, label=labels[i], zorder=2) plt.xticks(x_base, ticklabels) plt.legend() plt.savefig(filename) def main(): args = parse_args() tracks = gpx_parser.Tracks(args.infolder) years_distance = list() years_avg_spd = list() years = list() for year in range(2017, datetime.datetime.now().year + 1): month_avg_spd = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} month_distance = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} month_duration = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} for month in range(1, 13): if month == 12: max_day = (datetime.date(year + 1, 1, 1) - datetime.timedelta(days=1)).day else: max_day = (datetime.date(year, month + 1, 1) - datetime.timedelta(days=1)).day for day in range(1, max_day): date_tracks = tracks.get(year, month, day) for track in date_tracks: month_distance[month] += (track.distance / 1000) # km month_duration[month] += track.duration.total_seconds() / 3600 # h for i in range(1, 13): if month_duration[i] > 0: month_avg_spd[i] = month_distance[i] / month_duration[i] years_distance.append(month_distance.values()) years_avg_spd.append(month_avg_spd.values()) years.append(str(year)) out_folder = os.path.abspath(args.outfolder) dst_file_name = 'distance.png' plot_bar_chart(years, MONTH_LABELS, years_distance, 'Distance', 'Month', 'km', os.path.join(out_folder, dst_file_name)) avg_file_name = 'avg_spd.png' plot_bar_chart(years, MONTH_LABELS, years_avg_spd, 'Average Speed', 'Month', 'km/h', os.path.join(out_folder, avg_file_name)) html_file = os.path.join(out_folder, 'index.html') with open(html_file, 'w') as handle: handle.write('\n') handle.write('\n') handle.write('\n') handle.write('\n') handle.write(' Bicycle \n') handle.write('\n') handle.write('\n') handle.write('
\n') handle.write('

Bicycle

\n') handle.write('

\n') handle.write('\n') handle.write('\n') for year in years: handle.write('\n'.format(year)) handle.write('\n') handle.write('\n') for i in range(len(years_distance)): handle.write('\n'.format(round(sum(years_distance[i]), 1))) handle.write('\n') handle.write('
{}
{} km
\n') handle.write('

\n') handle.write('

\n') handle.write('Distance\n'.format(dst_file_name)) handle.write('Distance\n'.format(avg_file_name)) handle.write('

\n') handle.write('\n') handle.write('
\n') handle.write('\n') if __name__ == '__main__': sys.exit(main())