From 6e39242ca3cf1c439f8f6c583db553526f072ae8 Mon Sep 17 00:00:00 2001 From: Petar Petrov Date: Fri, 31 Jan 2025 16:44:22 +0200 Subject: [PATCH] Echarts: fix Y scaling (#23988) * Echarts: fix scaling of Y axis * fix fit logic to only extend the limits * handle invalid min for log scale --- src/components/chart/state-history-chart-line.ts | 15 +++++++++++++-- src/components/chart/statistics-chart.ts | 12 +++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/chart/state-history-chart-line.ts b/src/components/chart/state-history-chart-line.ts index 4c31a9b234..f55c205000 100644 --- a/src/components/chart/state-history-chart-line.ts +++ b/src/components/chart/state-history-chart-line.ts @@ -187,6 +187,11 @@ export class StateHistoryChartLine extends LitElement { ) { const dayDifference = differenceInDays(this.endTime, this.startTime); const rtl = computeRTL(this.hass); + const minYAxis = + // log(0) is -Infinity, so we need to set a minimum value + this.logarithmicScale && typeof this.minYAxis === "number" + ? Math.max(this.minYAxis, 0.1) + : this.minYAxis; this._chartOptions = { xAxis: { type: "time", @@ -213,8 +218,14 @@ export class StateHistoryChartLine extends LitElement { yAxis: { type: this.logarithmicScale ? "log" : "value", name: this.unit, - min: this.fitYData ? this.minYAxis : undefined, - max: this.fitYData ? this.maxYAxis : undefined, + min: + this.fitYData && typeof minYAxis === "number" + ? ({ min }) => Math.min(min, minYAxis!) + : minYAxis, + max: + this.fitYData && typeof this.maxYAxis === "number" + ? ({ max }) => Math.max(max, this.maxYAxis!) + : this.maxYAxis, position: rtl ? "right" : "left", scale: true, nameGap: 2, diff --git a/src/components/chart/statistics-chart.ts b/src/components/chart/statistics-chart.ts index 283055cabd..f35d1cdcbb 100644 --- a/src/components/chart/statistics-chart.ts +++ b/src/components/chart/statistics-chart.ts @@ -251,9 +251,15 @@ export class StatisticsChart extends LitElement { }, position: computeRTL(this.hass) ? "right" : "left", // @ts-ignore - scale: this.chartType !== "bar", - min: this.fitYData ? undefined : this.minYAxis, - max: this.fitYData ? undefined : this.maxYAxis, + scale: true, + min: + this.fitYData && typeof this.minYAxis === "number" + ? ({ min }) => Math.min(min, this.minYAxis!) + : this.minYAxis, + max: + this.fitYData && typeof this.maxYAxis === "number" + ? ({ max }) => Math.max(max, this.maxYAxis!) + : this.maxYAxis, splitLine: { show: true, lineStyle: splitLineStyle,