diff --git a/frontend/components/dashboard/DetailMiniTemperatureChart.tsx b/frontend/components/dashboard/DetailMiniTemperatureChart.tsx index 82dda219..bc33b86c 100644 --- a/frontend/components/dashboard/DetailMiniTemperatureChart.tsx +++ b/frontend/components/dashboard/DetailMiniTemperatureChart.tsx @@ -47,7 +47,7 @@ export function DetailMiniTemperatureChart({ detail }: { detail: CityDetail }) { label: forecastLabel, pointRadius: 0, spanGaps: true, - tension: 0.28, + tension: 0.1, }, ]; @@ -60,7 +60,7 @@ export function DetailMiniTemperatureChart({ detail }: { detail: CityDetail }) { label: calibratedLabel, pointRadius: 0, spanGaps: true, - tension: 0.3, + tension: 0.1, }); } diff --git a/frontend/components/dashboard/DetailPanelContent.module.css b/frontend/components/dashboard/DetailPanelContent.module.css index 395121b6..5143832d 100644 --- a/frontend/components/dashboard/DetailPanelContent.module.css +++ b/frontend/components/dashboard/DetailPanelContent.module.css @@ -106,8 +106,7 @@ } .root :global(.detail-mini-chart canvas) { - width: 100% !important; - height: 100% !important; + display: block; } .root :global(.detail-mini-chart-legend) { diff --git a/frontend/components/dashboard/FutureForecastModal.module.css b/frontend/components/dashboard/FutureForecastModal.module.css index 3ba4d053..1c9ef44f 100644 --- a/frontend/components/dashboard/FutureForecastModal.module.css +++ b/frontend/components/dashboard/FutureForecastModal.module.css @@ -785,8 +785,6 @@ } .root :global(.intraday-scene-frame canvas) { - width: 100%; - height: 100%; display: block; } diff --git a/frontend/components/dashboard/FutureForecastModalChart.tsx b/frontend/components/dashboard/FutureForecastModalChart.tsx index 916da92b..59aae99d 100644 --- a/frontend/components/dashboard/FutureForecastModalChart.tsx +++ b/frontend/components/dashboard/FutureForecastModalChart.tsx @@ -48,7 +48,7 @@ export function DailyTemperatureChart({ label: locale === "en-US" ? "DEB baseline" : "DEB 原始路径", parsing: false, pointRadius: 0, - tension: 0.3, + tension: 0.1, }); if (todayChartData.datasets.calibratedFutureSeries.length > 0) { @@ -64,7 +64,7 @@ export function DailyTemperatureChart({ parsing: false, pointHoverRadius: 5, pointRadius: 0, - tension: 0.32, + tension: 0.12, }); } @@ -81,7 +81,7 @@ export function DailyTemperatureChart({ pointHoverRadius: 6, pointRadius: 0, spanGaps: true, - tension: 0.3, + tension: 0.1, }); } @@ -146,7 +146,7 @@ export function DailyTemperatureChart({ label: locale === "en-US" ? "OM Raw" : "OM 原始", parsing: false, pointRadius: 0, - tension: 0.3, + tension: 0.1, }); } if ((todayChartData.tafMarkers || []).length > 0) { @@ -342,7 +342,7 @@ export function DailyTemperatureChart({ label: locale === "en-US" ? "Open-Meteo Temperature" : "Open-Meteo 温度", pointRadius: 2, - tension: 0.28, + tension: 0.1, }, { backgroundColor: "transparent", @@ -352,7 +352,7 @@ export function DailyTemperatureChart({ fill: false, label: locale === "en-US" ? "Dew Point" : "露点", pointRadius: 0, - tension: 0.24, + tension: 0.1, }, ], labels, diff --git a/frontend/components/dashboard/HistoryChart.tsx b/frontend/components/dashboard/HistoryChart.tsx index 299ac512..81490acf 100644 --- a/frontend/components/dashboard/HistoryChart.tsx +++ b/frontend/components/dashboard/HistoryChart.tsx @@ -54,7 +54,7 @@ export function HistoryChart() { pointBorderColor: "#fff", pointHoverRadius: 7, pointRadius: 5, - tension: 0.2, + tension: 0.1, }, { backgroundColor: "transparent", @@ -65,7 +65,7 @@ export function HistoryChart() { label: locale === "en-US" ? "DEB Fusion" : "DEB 融合", pointHoverRadius: 6, pointRadius: 4, - tension: 0.2, + tension: 0.1, }, ]; @@ -78,7 +78,7 @@ export function HistoryChart() { label: locale === "en-US" ? "MGM Official Forecast" : "MGM 官方预报", pointHoverRadius: 6, pointRadius: 4, - tension: 0.2, + tension: 0.1, }); } @@ -95,7 +95,7 @@ export function HistoryChart() { : `最佳单模型 (${summary.bestModelName})`, pointHoverRadius: 6, pointRadius: 4, - tension: 0.2, + tension: 0.1, }); } diff --git a/frontend/components/dashboard/ScanTerminalCard.module.css b/frontend/components/dashboard/ScanTerminalCard.module.css index 401f2927..eda70000 100644 --- a/frontend/components/dashboard/ScanTerminalCard.module.css +++ b/frontend/components/dashboard/ScanTerminalCard.module.css @@ -1061,8 +1061,6 @@ .root :global(.scan-ai-city-chart canvas) { display: block; - width: 100% !important; - height: 100% !important; } .root :global(.scan-ai-city-chart-placeholder) { diff --git a/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx b/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx index d4e05d4a..42c2d207 100644 --- a/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx +++ b/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx @@ -121,7 +121,7 @@ export const AiCityTemperatureChart = memo(function AiCityTemperatureChart({ det chartData.currentIndex != null && ctx.p0DataIndex < chartData.currentIndex ? [] : [6, 4], }, spanGaps: true, - tension: 0.28, + tension: 0.1, }, ]; @@ -135,7 +135,7 @@ export const AiCityTemperatureChart = memo(function AiCityTemperatureChart({ det pointHoverRadius: 5, pointRadius: 0, spanGaps: true, - tension: 0.32, + tension: 0.12, }); } diff --git a/frontend/lib/chart-utils.ts b/frontend/lib/chart-utils.ts index a5732476..aa863c03 100644 --- a/frontend/lib/chart-utils.ts +++ b/frontend/lib/chart-utils.ts @@ -380,13 +380,22 @@ export function getTemperatureChartData( validEntries.forEach((entry) => { dataByHour.set(entry.tail, Number.isFinite(entry.value) ? entry.value : null); }); + const getHourTemp = (h: number): number | null => { + const key = `${String(h).padStart(2, "0")}:00`; + return dataByHour.has(key) ? dataByHour.get(key)! : null; + }; const times: string[] = []; const temps: Array = []; for (let h = 0; h < 24; h++) { const hh = String(h).padStart(2, "0"); - const key = `${hh}:00`; - times.push(key); - temps.push(dataByHour.has(key) ? dataByHour.get(key)! : null); + times.push(`${hh}:00`); + temps.push(getHourTemp(h)); + if (h < 23) { + const a = getHourTemp(h); + const b = getHourTemp(h + 1); + times.push(`${hh}:30`); + temps.push(a != null && b != null ? Number((a + (b - a) * 0.5).toFixed(1)) : a ?? b); + } } const suppressAnkaraMgmObservation = isTurkishMgmCity(detail);