diff --git a/src/lib/cli.py b/src/lib/cli.py index 52ece0b5..98f49e2d 100644 --- a/src/lib/cli.py +++ b/src/lib/cli.py @@ -113,5 +113,5 @@ def main(): format = plot.default_save_format() path = args.save / f"{args.get_save_file_stem()}.{format}" - plot.save_to_path(path) + plot.save_to_path(path, dpi=args.save_dpi) print(f"wrote to {path}") diff --git a/src/lib/parsing/args.py b/src/lib/parsing/args.py index 9934a263..9ab6e49e 100644 --- a/src/lib/parsing/args.py +++ b/src/lib/parsing/args.py @@ -19,6 +19,7 @@ class Args(argparse.Namespace): show: bool save: Path | None save_format: str | None + save_dpi: float | None dask_graph: bool def get_data(self) -> DataWithAttrs: diff --git a/src/lib/parsing/parse.py b/src/lib/parsing/parse.py index a9cd1d9d..95c7f59c 100644 --- a/src/lib/parsing/parse.py +++ b/src/lib/parsing/parse.py @@ -31,6 +31,12 @@ def _get_parser(prefixes: Iterable[str]) -> argparse.ArgumentParser: default=None, help="format for saved animations (default: mp4, falls back to gif if ffmpeg unavailable)", ) + parser.add_argument( + "--save-dpi", + type=float, + default=None, + help="dots per inch of saved figure (defaults to Matplotlib's default)", + ) parser.add_argument( "--dask-graph", action="store_true", diff --git a/src/lib/plotting/animated_plot.py b/src/lib/plotting/animated_plot.py index fe1a117c..5efda2b0 100644 --- a/src/lib/plotting/animated_plot.py +++ b/src/lib/plotting/animated_plot.py @@ -60,7 +60,7 @@ def show(self): def allowed_save_formats(self) -> list[SaveFormat]: return ["mp4", "gif"] - def save_to_path(self, path: Path): + def save_to_path(self, path: Path, *, dpi: float | None = None): self._initialize() writer = PillowWriter() if path.suffix == ".gif" else FFMpegWriter() - self.anim.save(path, writer=writer) + self.anim.save(path, writer=writer, dpi=dpi) diff --git a/src/lib/plotting/plot.py b/src/lib/plotting/plot.py index 8e33d602..4b2f4a19 100644 --- a/src/lib/plotting/plot.py +++ b/src/lib/plotting/plot.py @@ -32,7 +32,7 @@ def add_hook(self, hook: Hook): def show(self): ... @abstractmethod - def save_to_path(self, path: Path): ... + def save_to_path(self, path: Path, *, dpi: float | None = None): ... @abstractmethod def allowed_save_formats(self) -> list[SaveFormat]: ... diff --git a/src/lib/plotting/renderers/field_2d.py b/src/lib/plotting/renderers/field_2d.py index d2fcd06a..f27c1de0 100644 --- a/src/lib/plotting/renderers/field_2d.py +++ b/src/lib/plotting/renderers/field_2d.py @@ -49,6 +49,7 @@ def init(self, fig: Figure, ax: Axes, full_data: Field, frame_data: Field, init_ origin="lower", extent=(*get_extent(da, spatial_dims[0]), *get_extent(da, spatial_dims[1])), norm=init_data.color_norm, + interpolation="nearest", ) fig.colorbar(self.im) diff --git a/src/lib/plotting/static_plot.py b/src/lib/plotting/static_plot.py index 9f0e37e2..4dd9b4af 100644 --- a/src/lib/plotting/static_plot.py +++ b/src/lib/plotting/static_plot.py @@ -32,6 +32,6 @@ def show(self): def allowed_save_formats(self) -> list[SaveFormat]: return ["png"] - def save_to_path(self, path: Path): + def save_to_path(self, path: Path, *, dpi: float | None = None): self._initialize() - self.fig.savefig(path, dpi=300.0) + self.fig.savefig(path, dpi=dpi or "figure")