import csv import dataclasses import datetime import pathlib import sys from matplotlib import patches from matplotlib import pyplot as plt LOW = 13 HIGH = 15 plt.rcParams["font.family"] = "monospace" plt.rcParams["font.monospace"] = ["IntelOne Mono"] @dataclasses.dataclass class Postbox: owner: str x: int y: int z: int postboxes = [] texts = [] with open("data.csv", "rt", newline="") as fr: for line in csv.reader(fr): x, y, z, owner = line postboxes.append(Postbox(owner, int(x), int(y), int(z))) fig: plt.Figure ax: plt.Axes fig, ax = plt.subplots(1, 1) minx, maxx = float("inf"), -float("inf") minz, maxz = float("inf"), -float("inf") legend = {} for box in postboxes: if "#" in box.owner: continue color = "green" label = "Available" if box.owner: color = "red" label = "Occupied" offset = 0 if box.y == HIGH: offset = 0.5 minx, maxx = min(minx, box.x), max(maxx, box.x) minz, maxz = min(minz, box.z), max(maxz, box.z) legend[bool(box.owner)] = ax.add_patch( patches.Rectangle( (box.x, box.z + offset), 1, 0.5, fill=True, color=color, label=label ) ) if box.owner: texts.append( ax.annotate( box.owner, (box.x + 0.5, box.z + offset + 0.25), color="black", ha="center", va="center", fontsize=6, ) ) ax.legend() plt.grid(True) minx, minz = minx - 0.5, minz - 0.5 maxx, maxz = maxx + 1.5, maxz + 1.5 ax.set_xlim(minx, maxx) ax.set_ylim(minz, maxz) ax.set_aspect("auto") ax.set_title("Haven Post Office\n" + str(datetime.date.today())) plt.legend = ax.legend(handles=legend.values(), loc="center") fig.set_size_inches((31.25, 11.5)) if len(sys.argv) >= 2: fig.savefig(pathlib.Path().absolute() / sys.argv[1], dpi=300) else: plt.show()