add save line as img
This commit is contained in:
@@ -46,7 +46,7 @@ class Save:
|
|||||||
"DATA_FIELD": ["TIFF", "PNG", "NPZ"],
|
"DATA_FIELD": ["TIFF", "PNG", "NPZ"],
|
||||||
"IMAGE": ["PNG", "TIFF", "NPZ"],
|
"IMAGE": ["PNG", "TIFF", "NPZ"],
|
||||||
"ANNOTATION_SOURCE": ["PNG", "TIFF", "NPZ"],
|
"ANNOTATION_SOURCE": ["PNG", "TIFF", "NPZ"],
|
||||||
"LINE": ["CSV", "NPZ", "JSON"],
|
"LINE": ["PNG", "TIFF", "CSV", "NPZ", "JSON"],
|
||||||
"RECORD_TABLE": ["CSV", "JSON"],
|
"RECORD_TABLE": ["CSV", "JSON"],
|
||||||
"DATA_TABLE": ["CSV", "JSON"],
|
"DATA_TABLE": ["CSV", "JSON"],
|
||||||
"FLOAT": ["TXT", "JSON"],
|
"FLOAT": ["TXT", "JSON"],
|
||||||
@@ -57,6 +57,11 @@ class Save:
|
|||||||
},
|
},
|
||||||
"optional": {
|
"optional": {
|
||||||
"directory": ("DIRECTORY", {"label": "directory"}),
|
"directory": ("DIRECTORY", {"label": "directory"}),
|
||||||
|
"plot_title": ("STRING", {
|
||||||
|
"default": "",
|
||||||
|
"placeholder": "plot title (optional)",
|
||||||
|
"label": "title",
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +84,7 @@ class Save:
|
|||||||
format: str,
|
format: str,
|
||||||
value,
|
value,
|
||||||
directory: str | None = None,
|
directory: str | None = None,
|
||||||
|
plot_title: str = "",
|
||||||
):
|
):
|
||||||
path = self._resolve_save_path(filename, format, directory, directory_path)
|
path = self._resolve_save_path(filename, format, directory, directory_path)
|
||||||
|
|
||||||
@@ -88,11 +94,11 @@ class Save:
|
|||||||
self._save_datafield(path, value, format)
|
self._save_datafield(path, value, format)
|
||||||
elif isinstance(value, np.ndarray):
|
elif isinstance(value, np.ndarray):
|
||||||
if value.ndim == 1:
|
if value.ndim == 1:
|
||||||
self._save_line(path, LineData(data=value), format)
|
self._save_line(path, LineData(data=value), format, title=plot_title)
|
||||||
else:
|
else:
|
||||||
self._save_image_or_array(path, value, format)
|
self._save_image_or_array(path, value, format)
|
||||||
elif isinstance(value, LineData):
|
elif isinstance(value, LineData):
|
||||||
self._save_line(path, value, format)
|
self._save_line(path, value, format, title=plot_title)
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list):
|
||||||
self._save_table(path, value, format)
|
self._save_table(path, value, format)
|
||||||
elif isinstance(value, (int, float, np.floating, np.integer)):
|
elif isinstance(value, (int, float, np.floating, np.integer)):
|
||||||
@@ -176,9 +182,12 @@ class Save:
|
|||||||
return
|
return
|
||||||
raise ValueError(f"Format {format_name} is not supported for IMAGE.")
|
raise ValueError(f"Format {format_name} is not supported for IMAGE.")
|
||||||
|
|
||||||
def _save_line(self, path: Path, line: LineData, format_name: str):
|
def _save_line(self, path: Path, line: LineData, format_name: str, title: str = ""):
|
||||||
y = np.asarray(line.data, dtype=np.float64).ravel()
|
y = np.asarray(line.data, dtype=np.float64).ravel()
|
||||||
x = np.asarray(line.x_axis, dtype=np.float64).ravel()[: len(y)] if line.x_axis is not None else np.arange(len(y), dtype=np.float64)
|
x = np.asarray(line.x_axis, dtype=np.float64).ravel()[: len(y)] if line.x_axis is not None else np.arange(len(y), dtype=np.float64)
|
||||||
|
if format_name in ("PNG", "TIFF"):
|
||||||
|
self._save_line_plot(path, x, y, line.x_unit, line.y_unit, title, format_name)
|
||||||
|
return
|
||||||
if format_name == "CSV":
|
if format_name == "CSV":
|
||||||
with path.open("w", newline="", encoding="utf-8") as fh:
|
with path.open("w", newline="", encoding="utf-8") as fh:
|
||||||
writer = csv.writer(fh)
|
writer = csv.writer(fh)
|
||||||
@@ -199,6 +208,33 @@ class Save:
|
|||||||
return
|
return
|
||||||
raise ValueError(f"Format {format_name} is not supported for LINE.")
|
raise ValueError(f"Format {format_name} is not supported for LINE.")
|
||||||
|
|
||||||
|
def _save_line_plot(
|
||||||
|
self,
|
||||||
|
path: Path,
|
||||||
|
x: np.ndarray,
|
||||||
|
y: np.ndarray,
|
||||||
|
x_unit: str,
|
||||||
|
y_unit: str,
|
||||||
|
title: str,
|
||||||
|
format_name: str,
|
||||||
|
):
|
||||||
|
import matplotlib
|
||||||
|
matplotlib.use("Agg")
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
|
||||||
|
ax.plot(x, y, linewidth=1.2, color="#4f8ef7")
|
||||||
|
ax.set_xlabel(x_unit if x_unit else "x")
|
||||||
|
ax.set_ylabel(y_unit if y_unit else "y")
|
||||||
|
if title and title.strip():
|
||||||
|
ax.set_title(title.strip())
|
||||||
|
ax.grid(True, linestyle="--", linewidth=0.5, alpha=0.5)
|
||||||
|
fig.tight_layout()
|
||||||
|
|
||||||
|
ext = ".png" if format_name == "PNG" else ".tiff"
|
||||||
|
fig.savefig(str(path.with_suffix(ext)), format=format_name.lower(), dpi=150)
|
||||||
|
plt.close(fig)
|
||||||
|
|
||||||
def _save_table(self, path: Path, rows: list, format_name: str):
|
def _save_table(self, path: Path, rows: list, format_name: str):
|
||||||
if format_name == "JSON":
|
if format_name == "JSON":
|
||||||
path.write_text(json.dumps(rows, indent=2), encoding="utf-8")
|
path.write_text(json.dumps(rows, indent=2), encoding="utf-8")
|
||||||
|
|||||||
Reference in New Issue
Block a user