#!/usr/bin/env python3 import json import pathlib import matplotlib.pyplot as plt import pandas as pd import sys # Load data filename = pathlib.Path(sys.argv[1]) UNIT_TO_ABBREVIATION = { "Meters": "m", "Feet": "ft", "Inches": "in", "Degrees": "deg", "Rotations": "rot", "Radians": "rad", } # Make DataFrame to facilitate plotting if filename.suffix == ".json": raw_data = json.loads(filename.read_text()) unit = raw_data["units"] # Get Unit try: abbreviation = UNIT_TO_ABBREVIATION[unit] except KeyError: raise ValueError("Invalid Unit") # Make Columns columns = ["Timestamp (s)", "Test"] if "Drive" in raw_data["test"]: columns.extend( [ "Left Volts (V)", "Right Volts (V)", f"Left Position ({abbreviation})", f"Right Position ({abbreviation})", f"Left Velocity ({abbreviation}/s)", f"Right Velocity ({abbreviation}/s)", "Gyro Position (deg)", "Gyro Rate (deg/s)", ] ) unit_columns = columns[4:8] else: columns.extend( ["Volts (V)", f"Position ({abbreviation})", f"Velocity ({abbreviation}/s)"] ) unit_columns = columns[3:] prepared_data = pd.DataFrame(columns=columns) for test in raw_data.keys(): if "-" not in test: continue formatted_entry = [[pt[0], test, *pt[1:]] for pt in raw_data[test]] prepared_data = pd.concat( [prepared_data, pd.DataFrame(formatted_entry, columns=columns)] ) units_per_rot = raw_data["unitsPerRotation"] for column in unit_columns: prepared_data[column] *= units_per_rot else: prepared_data = pd.read_csv(filename) # First 2 columns are Timestamp and Test for column in prepared_data.columns[2:]: # Configure Plot Labels plt.figure() plt.xlabel("Timestamp (s)") plt.ylabel(column) # Configure title without units print(column) end = column.find("(") plt.title(f"{column[:end].strip()} vs Time") # Plot data for each test for test in pd.unique(prepared_data["Test"]): test_data = prepared_data[prepared_data["Test"] == test] plt.plot(test_data["Timestamp (s)"], test_data[column], label=test) plt.legend() plt.show()