feat(visualization+report): 接入 Step9 浓度反演数据至可视化面板与报告生成器
This commit is contained in:
@ -359,6 +359,64 @@ class VisualizationWorkerThread(QThread):
|
||||
parts.append("采样点图: 跳过(无CSV)")
|
||||
else:
|
||||
parts.append("采样点图: 跳过(无影像)")
|
||||
|
||||
if self.extra.get("gen_concentration"):
|
||||
conc_dir = wp / "9_Concentration"
|
||||
conc_csv = conc_dir / "final_concentrations.csv"
|
||||
if conc_csv.is_file():
|
||||
charts_dir = conc_dir / "charts"
|
||||
charts_dir.mkdir(parents=True, exist_ok=True)
|
||||
try:
|
||||
import pandas as pd
|
||||
df = pd.read_csv(conc_csv)
|
||||
exclude_kw = (
|
||||
"wavelength", "lon", "lat", "utm_x", "utm_y",
|
||||
"x", "y", "coord", "longitude", "latitude",
|
||||
"sample_id", "id", "index", "name", "pixel",
|
||||
)
|
||||
conc_cols = [
|
||||
c for c in df.select_dtypes(include=[np.number]).columns
|
||||
if not any(k in str(c).lower() for k in exclude_kw)
|
||||
]
|
||||
if conc_cols:
|
||||
orig_out = viz.output_dir
|
||||
viz.output_dir = str(charts_dir)
|
||||
output_dict = viz.plot_statistical_charts(
|
||||
csv_path=str(conc_csv),
|
||||
parameter_columns=conc_cols,
|
||||
)
|
||||
viz.output_dir = orig_out
|
||||
count = len([v for v in output_dict.values() if v])
|
||||
parts.append(f"浓度统计图: {count} 个")
|
||||
stats_rows = []
|
||||
for col in conc_cols:
|
||||
s = df[col].dropna()
|
||||
if len(s) == 0:
|
||||
continue
|
||||
stats_rows.append({
|
||||
"参数": col,
|
||||
"点位数": len(s),
|
||||
"最小值": round(float(s.min()), 4),
|
||||
"最大值": round(float(s.max()), 4),
|
||||
"均值": round(float(s.mean()), 4),
|
||||
"中位数": round(float(s.median()), 4),
|
||||
"标准差": round(float(s.std()), 4) if len(s) > 1 else 0.0,
|
||||
})
|
||||
if stats_rows:
|
||||
pd.DataFrame(stats_rows).to_csv(
|
||||
conc_dir / "statistics_summary.csv",
|
||||
index=False,
|
||||
encoding="utf-8-sig",
|
||||
)
|
||||
parts.append("浓度统计表: 已生成")
|
||||
else:
|
||||
parts.append("浓度统计表: 跳过(无可用列)")
|
||||
else:
|
||||
parts.append("浓度统计图: 跳过(无可用浓度列)")
|
||||
except Exception as e:
|
||||
parts.append(f"浓度统计图: 失败({e})")
|
||||
else:
|
||||
parts.append("浓度统计图: 跳过(无浓度CSV)")
|
||||
self.finished_ok.emit({"task": "generate_all_selected", "parts": parts})
|
||||
else:
|
||||
self.failed.emit(f"未知可视化任务: {self.task}")
|
||||
@ -568,6 +626,7 @@ class ImageCategoryTree(QTreeWidget):
|
||||
"output_dir": "输出目录",
|
||||
"8_spatial_inversion": "空间反演",
|
||||
"4_processed_data": "处理数据",
|
||||
"9_Concentration": "物理反演浓度分布",
|
||||
}
|
||||
|
||||
def __init__(self, parent=None):
|
||||
@ -767,6 +826,7 @@ class ImageCategoryTree(QTreeWidget):
|
||||
self._work_path / "3_deglint",
|
||||
self._work_path / "1_water_mask",
|
||||
self._work_path / "9_water_quality_prediction",
|
||||
self._work_path / "9_Concentration",
|
||||
]
|
||||
|
||||
# 只保留存在的目录,并补充工作根目录作为兜底
|
||||
|
||||
Reference in New Issue
Block a user