Add helper stuff for figures, cleanup

This commit is contained in:
2026-02-20 01:56:28 +01:00
parent 28823dc0b5
commit 101bd81ca1
20 changed files with 1862 additions and 1164 deletions

114
figures/bargraph.py Normal file
View File

@@ -0,0 +1,114 @@
import argparse
import json
import os
import sys
import matplotlib.pyplot as plt
def load_json_data(file_path):
"""
Load and validate JSON data from a file.
Expected format:
{
"label1": value1,
"label2": value2,
...
}
"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"File not found: {file_path}")
with open(file_path, "r", encoding="utf-8") as f:
data = json.load(f)
if not isinstance(data, dict):
raise ValueError(
"JSON must be an object with key-value pairs (labels: values)."
)
for key, value in data.items():
if not isinstance(key, str):
raise ValueError("All keys must be strings (labels).")
if not isinstance(value, (int, float)):
raise ValueError("All values must be numeric (int or float).")
return data
def create_bar_graph(
data, title="Bar Graph", x_label="Labels", y_label="Values", output=None
):
"""
Create a bar graph from a dictionary of data.
"""
labels = list(data.keys())
values = list(data.values())
plt.figure(figsize=(10, 6))
plt.bar(labels, values)
plt.xlabel(x_label)
plt.ylabel(y_label)
plt.title(title)
plt.xticks(rotation=45)
plt.tight_layout()
if output:
plt.savefig(output)
print(f"Graph saved to: {output}")
else:
plt.show()
def main():
parser = argparse.ArgumentParser(
description="Generate a bar graph from a JSON file containing key-value pairs."
)
parser.add_argument(
"json_path",
type=str,
help="Path to the JSON file (e.g., data.json)",
)
parser.add_argument(
"--title",
type=str,
default="Bar Graph",
help="Title of the bar graph",
)
parser.add_argument(
"--x_label",
type=str,
default="Labels",
help="Label for the x-axis",
)
parser.add_argument(
"--y_label",
type=str,
default="Values",
help="Label for the y-axis",
)
parser.add_argument(
"--output",
type=str,
default=None,
help="Optional output file path (e.g., graph.png). If not provided, the graph will be displayed.",
)
args = parser.parse_args()
try:
data = load_json_data(args.json_path)
create_bar_graph(
data,
title=args.title,
x_label=args.x_label,
y_label=args.y_label,
output=args.output,
)
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()