old_vs_new.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from datetime import datetime, timedelta
  2. from itertools import chain
  3. import numpy
  4. from labours.objects import DevDay
  5. from labours.plotting import deploy_plot, get_plot_path, import_pyplot
  6. def show_old_vs_new(args, name, start_date, end_date, people, days):
  7. from scipy.signal import convolve, slepian
  8. start_date = datetime.fromtimestamp(start_date)
  9. start_date = datetime(start_date.year, start_date.month, start_date.day)
  10. end_date = datetime.fromtimestamp(end_date)
  11. end_date = datetime(end_date.year, end_date.month, end_date.day)
  12. new_lines = numpy.zeros((end_date - start_date).days + 2)
  13. old_lines = numpy.zeros_like(new_lines)
  14. for day, devs in days.items():
  15. for stats in devs.values():
  16. new_lines[day] += stats.Added
  17. old_lines[day] += stats.Removed + stats.Changed
  18. resolution = 32
  19. window = slepian(max(len(new_lines) // resolution, 1), 0.5)
  20. new_lines = convolve(new_lines, window, "same")
  21. old_lines = convolve(old_lines, window, "same")
  22. matplotlib, pyplot = import_pyplot(args.backend, args.style)
  23. plot_x = [start_date + timedelta(days=i) for i in range(len(new_lines))]
  24. pyplot.fill_between(plot_x, new_lines, color="#8DB843", label="Changed new lines")
  25. pyplot.fill_between(plot_x, old_lines, color="#E14C35", label="Changed existing lines")
  26. pyplot.legend(loc=2, fontsize=args.font_size)
  27. for tick in chain(pyplot.gca().xaxis.get_major_ticks(), pyplot.gca().yaxis.get_major_ticks()):
  28. tick.label.set_fontsize(args.font_size)
  29. if args.mode == "all" and args.output:
  30. output = get_plot_path(args.output, "old_vs_new")
  31. else:
  32. output = args.output
  33. deploy_plot("Additions vs changes", output, args.background)