C# - Windows 窗体图表 - AxisX.IntervalOffset 不起作用

问题描述 投票:0回答:1

我正在尝试抵消我的专业网格和标签样式。当我设置一个间隔时,它工作正常,但是当我尝试抵消该间隔时,我无法让它工作。

绘制图表的数据沿 x 轴有固定点。它们始终相同且对数(不确定是否相关)。

无论我尝试过的 IntervalOffset 值是多少,它总是相同的。我也尝试过设置 IntervalOffsetType 和 Interval 类型(我尝试过的不同内容在代码中显示)。我想要的是标签和主要网格线从 63 开始并每三个点重复一次。

这是一些代码:

包含图表的表单中的代码

private void setupChart()
{
    // Setup Chart
    chartPathData.Legends[0].Docking = Docking.Bottom;


    chartPathData.ChartAreas[0].AxisX.LabelStyle.IntervalOffset = 1;
    chartPathData.ChartAreas[0].AxisX.LabelStyle.Interval = 3;
    chartPathData.ChartAreas[0].AxisX.LabelStyle.IntervalType = 0;
    chartPathData.ChartAreas[0].AxisX.LabelStyle.IntervalOffsetType = 0;

    chartPathData.ChartAreas[0].AxisX.MajorGrid.IntervalOffset = 1;
    chartPathData.ChartAreas[0].AxisX.MajorGrid.Interval = 3;
    chartPathData.ChartAreas[0].AxisX.MajorGrid.IntervalType = DateTimeIntervalType.Number;
     chartPathData.ChartAreas[0].AxisX.MajorGrid.IntervalOffsetType = DateTimeIntervalType.Number;


    chartPathData.ChartAreas[0].AxisY.Minimum = 0;
    chartPathData.ChartAreas[0].AxisY.Maximum = 100;
}

private void GraphPath(Pathdata pathData, string pathName, Color color)
{
    var seriesPath = new Series
    {
        Name = pathName,
        IsVisibleInLegend = true,
        IsXValueIndexed = true,
        Color = color,
        ChartType = SeriesChartType.FastLine
    };

    chartPathData.Series.Add(seriesPath);

    // GraphPath just creates a graphable version
    // of pathData assigning X values at the corresponding
    // properties (creating x,y points)
    GraphPath graphPath = new GraphPath(pathData);
    foreach (GraphPoint point in graphPath.GraphPoints)
    {               
        seriesPath.Points.AddXY(point.x, point.y);
    }

}

DataPath 类

    public class DataPath
{        
    public ThirdOctaveValue A50 { get; set; }
    public ThirdOctaveValue A63 { get; set; }
    public ThirdOctaveValue A80 { get; set; }
    public ThirdOctaveValue A100 { get; set; }
    public ThirdOctaveValue A125 { get; set; }
    public ThirdOctaveValue A160 { get; set; }
    public ThirdOctaveValue A200 { get; set; }
    public ThirdOctaveValue A250 { get; set; }
    public ThirdOctaveValue A315 { get; set; }
    public ThirdOctaveValue A400 { get; set; }
    public ThirdOctaveValue A500 { get; set; }
    public ThirdOctaveValue A630 { get; set; }
    public ThirdOctaveValue A800 { get; set; }
    public ThirdOctaveValue A1000 { get; set; }
    public ThirdOctaveValue A1250 { get; set; }
    public ThirdOctaveValue A1600 { get; set; }
    public ThirdOctaveValue A2000 { get; set; }
    public ThirdOctaveValue A2500 { get; set; }
    public ThirdOctaveValue A3150 { get; set; }
    public ThirdOctaveValue A4000 { get; set; }
    public ThirdOctaveValue A5000 { get; set; }
}

这是结果

c# charts windows-forms-designer
1个回答
0
投票

正确,

Axis.IntervalOffset()
属性没有效果。研究公共 .net 源代码表明,除了其自己的赋值和检索之外,该参数没有在任何地方被引用。

使用

IntervalOffset
Minimum
参数设置
Interval
的任何解决方案都会隐式设置轴的零点,而无需设置参数。然而,只有在
Axis
内部完成最小值自动计算后才能完成此操作。一旦手动设置了一次最小值,自动计算就会停止,需要手动重新计算。添加或删除数据需要执行以下操作,假设相关图表为
Chart1
ChartArea
的索引为零,感兴趣的轴为
AxisX
,并且轴'.Interval 已设置为非零值.:

With Chart1.ChartAreas(0)
    .AxisX.Minimum = Double.NaN
    .Recalculate()
    .AxisX.Minimum = .AxisX.Interval * System.Math.Floor(.AxisX.Minimum / .AxisX.Interval)
End With

第一行将

Minimum
重置为非固定值(Double.NaN);第二行强制轴根据显示的数据重新计算其精确边界;第三个设置
Minimum
等于间隔的整数倍,位于数据精确最小值的左侧(或数字下方)。

这样做时,轴按指定间隔间隔,以间隔的整数倍间隔,超出数据限制。严格来说,这并没有设置最大值,允许浮动到数据的精确最大值,因此为了完整性可以执行以下操作:

With Chart1.ChartAreas(0)
    .AxisX.Minimum = Double.NaN
    .AxisX.Maximum = Double.NaN
    .Recalculate()
    .AxisX.Minimum = .AxisX.Interval * System.Math.Floor(.AxisX.Minimum / .AxisX.Interval)
    .AxisX.Maximum = .AxisX.Interval * System.Math.Ceiling(.AxisX.Maximum / .AxisX.Interval)
End With

这设置了两端,现在轴的行为就像 Y 轴本身对数据的行为一样。

© www.soinside.com 2019 - 2024. All rights reserved.