blob: 6878126af2c1b6be3cf069d594c8bfcdf916e64a [file] [log] [blame]
#!/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()