hyperfine/scripts/plot_whisker.py
Benjamin Rosemann b04a9ec6c4 Add parameters to plotting scripts
Add `imgname` parameter to be able to save a plot to a file instead of
showing it. Use-case: platforms without GUI like docker containers.

Add `labels` parameter to histogram plot. Use-case: replacing long
commands with human friendly labels.
2021-02-16 08:21:45 +01:00

49 lines
1.5 KiB
Python
Executable File

#!/usr/bin/env python
"""This program shows `hyperfine` benchmark results as a box and whisker plot.
Quoting from the matplotlib documentation:
The box extends from the lower to upper quartile values of the data, with
a line at the median. The whiskers extend from the box to show the range
of the data. Flier points are those past the end of the whiskers.
"""
import argparse
import json
import matplotlib.pyplot as plt
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("file", help="JSON file with benchmark results")
parser.add_argument("--title", help="Plot Title")
parser.add_argument(
"--labels", help="Comma-separated list of entries for the plot legend"
)
parser.add_argument("--imgname", help="Save image to the given filename.")
args = parser.parse_args()
with open(args.file) as f:
results = json.load(f)["results"]
if args.labels:
labels = args.labels.split(",")
else:
labels = [b["command"] for b in results]
times = [b["times"] for b in results]
boxplot = plt.boxplot(times, vert=True, patch_artist=True)
cmap = plt.cm.get_cmap("rainbow")
colors = [cmap(val / len(times)) for val in range(len(times))]
for patch, color in zip(boxplot["boxes"], colors):
patch.set_facecolor(color)
if args.title:
plt.title(args.title)
plt.legend(handles=boxplot["boxes"], labels=labels, loc="best", fontsize="medium")
plt.ylabel("Time [s]")
plt.ylim(0, None)
if args.imgname:
plt.savefig(args.imgname)
else:
plt.show()