From 9688ee208c4ee92d828f0b8bdbd2fe484bb08df5 Mon Sep 17 00:00:00 2001 From: Huarch Date: Mon, 6 Jul 2026 18:44:55 +0800 Subject: [PATCH] fix: update chart risk label --- app/prediction.py | 2 +- example.xlsx | Bin 13081 -> 13095 bytes tests/test_prediction.py | 6 ++++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/prediction.py b/app/prediction.py index e55edaf..65b4856 100644 --- a/app/prediction.py +++ b/app/prediction.py @@ -456,7 +456,7 @@ def render_survival_chart(df: pd.DataFrame, curves, image_path: Path) -> tuple[l font_kwargs = chinese_font_kwargs() plt.xlabel("管龄(年)", **font_kwargs) - plt.ylabel("生存概率", **font_kwargs) + plt.ylabel("健康风险", **font_kwargs) plt.title("预测分析图", **font_kwargs) plt.grid(alpha=0.18) if len(summary_rows) <= 12: diff --git a/example.xlsx b/example.xlsx index 60e345c35b961bf52de722317f93433150f6d278..eb84766c93bd1e53e7822f8b7c90212d25f12761 100644 GIT binary patch delta 3589 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 None: + def test_survival_chart_uses_expected_axis_labels(self) -> None: df = pd.DataFrame({ID_COLUMN: ["P001"], PIPE_AGE_COLUMN: [12]}) with TemporaryDirectory() as temp_dir: output_path = Path(temp_dir) / "chart.png" - with patch("app.prediction.plt.xlabel") as xlabel: + with patch("app.prediction.plt.xlabel") as xlabel, patch("app.prediction.plt.ylabel") as ylabel: render_survival_chart(df, [DummyCurve([1, 2], [0.9, 0.7])], output_path) xlabel.assert_called_once() self.assertEqual(xlabel.call_args.args[0], "管龄(年)") + ylabel.assert_called_once() + self.assertEqual(ylabel.call_args.args[0], "健康风险") if __name__ == "__main__":