radn-dev/xmetrics/render.py
2023-07-31 12:50:28 +00:00

127 lines
2.2 KiB
Python

import json
from functools import cache
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import hsv_to_rgb
plt.rcParams["figure.figsize"] = [18, 9]
plt.style.use("dark_background")
plt.subplots_adjust(left=0.05, right=0.99, top=0.95, bottom=0.05)
plt.margins(x=0.025)
with open("metrics.json", "r") as file:
metrics = json.load(file)
entries = metrics["entries"]
cors = metrics["cors"]
def render_ploc():
X, Y, Ya, Yd = np.array(entries).transpose()
plt.clf()
plt.plot(X, Y, linewidth=1.0)
plt.fill_between(
X,
Y - Ya,
Y,
alpha=0.5,
color="green",
linewidth=0.0,
)
plt.fill_between(
X,
Y,
Y + Yd,
alpha=0.5,
color="red",
linewidth=0.0,
)
plt.ylim(bottom=0)
plt.savefig("/code/metrics/metrics.png")
@cache
def get_m():
return len(cors)
@cache
def get_n():
return len(cors[0])
@cache
def get_y():
return np.array(cors)
@cache
def _get_x(px: bool):
if px:
return abs(np.diff(get_y(), axis=1, prepend=0)).sum(axis=0).cumsum()
else:
return np.arange(get_n())
def get_x(*, px: bool):
return _get_x(px)
@cache
def get_w():
return get_y().max(axis=1)
@cache
def _get_z(pc: bool):
M = get_m()
if pc:
W = get_w()
I = W.cumsum()
assert I.shape == (M,)
return (I - W / 2) / I.max() * M
else:
return np.arange(M)
def get_z(*, pc: bool):
return _get_z(pc)
@cache
def _get_c(pc: bool):
M = get_m()
Z = get_z(pc=pc)
W = get_w()
return hsv_to_rgb(np.array([3.0 * Z / M % 1, 0.4 + Z * 0, 0.6 + 0.15 * (Z / M)]).transpose())
def get_c(*, pc: bool):
return _get_c(pc)
def render_cors(*, px, pc):
M = get_m()
N = get_n()
Y = get_y()
X = get_x(px=px)
assert Y.shape == (M, N)
plt.clf()
C = get_c(pc=pc)
plt.stackplot(
X,
Y,
colors=C,
aa=False,
linewidth=0.0,
)
plt.savefig(f"/code/metrics/metrics-px{int(px)}-pc{int(pc)}.png")
render_ploc()
render_cors(px=False, pc=False)
render_cors(px=False, pc=True)
render_cors(px=True, pc=False)
render_cors(px=True, pc=True)