From 28a1f1a4515f7d45f3d8a8d5c074be3bf0445138 Mon Sep 17 00:00:00 2001 From: Sunny Date: Wed, 5 Mar 2025 21:12:11 +0800 Subject: [PATCH] =?UTF-8?q?*=20UIBarChart:=20=E5=A2=9E=E5=8A=A0Y=E8=BD=B4?= =?UTF-8?q?=E9=9B=B6=E5=BA=A6=E7=BA=BF=E5=81=8F=E7=A7=BB=E9=87=8F=EF=BC=8C?= =?UTF-8?q?Option.ZeroLineOffset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SunnyUI/Charts/UIBarChart.cs | 34 ++++++++++++++++++------------ SunnyUI/Charts/UIBarChartOption.cs | 5 +++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/SunnyUI/Charts/UIBarChart.cs b/SunnyUI/Charts/UIBarChart.cs index 7ca68dbc..fdad3539 100644 --- a/SunnyUI/Charts/UIBarChart.cs +++ b/SunnyUI/Charts/UIBarChart.cs @@ -33,6 +33,7 @@ * 2023-06-06: V3.3.7 修复Y轴文字居中 * 2024-06-08: V3.6.6 修复X轴文字带角度显示时居中 * 2024-10-25: V3.7.2 增加了一个快捷的显示数据函数ShowData + * 2025-03-05: V3.8.1 增加Y轴零度线偏移量,Option.ZeroLineOffset ******************************************************************************/ using System; @@ -210,7 +211,7 @@ namespace Sunny.UI float ww = Math.Min(x2, series.MaxWidth); xx -= ww / 2.0f; - float YZeroPos = YScale.CalcYPixel(0, DrawOrigin.Y, DrawSize.Height); + float YZeroPos = YScale.CalcYPixel(Option.ZeroLineOffset, DrawOrigin.Y, DrawSize.Height); float VPos = YScale.CalcYPixel(series.Data[j], DrawOrigin.Y, DrawSize.Height); if (VPos <= YZeroPos) @@ -256,7 +257,7 @@ namespace Sunny.UI float ww = Math.Min(x2, series.MaxWidth); float xl = (DrawBarWidth - Option.SeriesCount * ww - (Option.SeriesCount - 1) * Option.BarInterval) / 2.0f; float xx = barX + xl + i * ww + i * Option.BarInterval; - float YZeroPos = YScale.CalcYPixel(0, DrawOrigin.Y, DrawSize.Height); + float YZeroPos = YScale.CalcYPixel(Option.ZeroLineOffset, DrawOrigin.Y, DrawSize.Height); float VPos = YScale.CalcYPixel(series.Data[j], DrawOrigin.Y, DrawSize.Height); if (VPos <= YZeroPos) @@ -537,6 +538,11 @@ namespace Sunny.UI double[] YLabels = YScale.CalcLabels(); float[] labels = YScale.CalcYPixels(YLabels, DrawOrigin.Y, DrawSize.Height); float wmax = 0; + + using Pen pn = new Pen(ForeColor); + pn.DashStyle = DashStyle.Dash; + pn.DashPattern = new float[] { 3, 3 }; + for (int i = 0; i < labels.Length; i++) { if (labels[i] > DrawOrigin.Y) continue; @@ -547,17 +553,16 @@ namespace Sunny.UI if (YLabels[i].IsNanOrInfinity()) continue; if (!Option.YAxis.ShowGridLine) continue; - if (!YLabels[i].EqualsDouble(0)) - { - using Pen pn = new Pen(ForeColor); - pn.DashStyle = DashStyle.Dash; - pn.DashPattern = new float[] { 3, 3 }; - g.DrawLine(pn, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]); - } - else - { - g.DrawLine(ForeColor, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]); - } + //if (!YLabels[i].EqualsDouble(Option.ZeroLineOffset)) + //{ + + g.DrawLine(pn, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]); + + //} + //else + //{ + // g.DrawLine(ForeColor, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]); + //} } if (Option.YAxis.AxisLabel.Show) @@ -576,6 +581,9 @@ namespace Sunny.UI float yy = Option.Grid.Top + DrawSize.Height / 2.0f; g.DrawRotateString(Option.YAxis.Name, TempFont, ForeColor, new PointF(xx, yy), 270); } + + float YZeroPos = YScale.CalcYPixel(Option.ZeroLineOffset, DrawOrigin.Y, DrawSize.Height); + g.DrawLine(ForeColor, DrawOrigin.X, YZeroPos, Width - Option.Grid.Right, YZeroPos); } private void DrawAxisScales(Graphics g) diff --git a/SunnyUI/Charts/UIBarChartOption.cs b/SunnyUI/Charts/UIBarChartOption.cs index b828f6db..658c2880 100644 --- a/SunnyUI/Charts/UIBarChartOption.cs +++ b/SunnyUI/Charts/UIBarChartOption.cs @@ -87,6 +87,11 @@ namespace Sunny.UI public int BarInterval { get; set; } = -1; + /// + /// Y轴零度线偏移 + /// + public double ZeroLineOffset { get; set; } = 0; + public void AddSeries(UIBarSeries series) { if (series == null)