Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS海图控制中的十进制对数轴_C#_Mschart - Fatal编程技术网

C# MS海图控制中的十进制对数轴

C# MS海图控制中的十进制对数轴,c#,mschart,C#,Mschart,我想创建十年对数y轴,如第一张图所示。第一张图片的对数y轴最小值为78。然后以10的幂次显示其他轴值,如100和1000。最后,它显示了对数y轴的最大值。第一个图形不是使用MS图表控件开发的 第二张图中的图形是使用MS Chart控件开发的。在第二张图中,我无法显示10次方的轴值,例如100和1000,类似于第一张图。我正在使用下面的代码创建此图 axis.MinorGrid.Interval = 1; axis.MinorTickMark.Interval = 1; a

我想创建十年对数y轴,如第一张图所示。第一张图片的对数y轴最小值为78。然后以10的幂次显示其他轴值,如100和1000。最后,它显示了对数y轴的最大值。第一个图形不是使用MS图表控件开发的

第二张图中的图形是使用MS Chart控件开发的。在第二张图中,我无法显示10次方的轴值,例如100和1000,类似于第一张图。我正在使用下面的代码创建此图

    axis.MinorGrid.Interval = 1;
    axis.MinorTickMark.Interval = 1;
    axis.MajorGrid.Interval = 1;
    axis.MajorTickMark.Interval = 1;
我想创建与第一个图形类似的第二个图形


经过相当的努力,我找到了这个问题的解决办法。为了以10的幂次显示对数y轴值,需要为标签设置间隔偏移。也可以相应地设置主栅格和次栅格。例如,在图2中,最小值为78.53。所以如果我们想显示100,我们需要设置偏移量为21.47。要计算偏移量,我必须进行计算

100-78.53=21.47

现在,由于我们正在处理y轴的对数值,我们需要在对数值中执行此计算

偏移量=log100-log78.53

如果我们将图片2中的上述偏移设置为轴标签样式、主栅格和次栅格,那么第一个标签和栅格将从100开始,然后根据需要设置1000、100000。标签样式、主栅格和次栅格的间隔应设置为1,表示10年

现在第二个问题是如何显示图的最小值和最大值。默认情况下,MS图表不会显示这些值。我们需要处理自定义标签,以显示最小值和最大值以及介于10、100、1000等之间的值,因为如果我们添加自定义标签,那么我们需要自己处理轴的标签

下面是创建上述所需图形的代码

            chart1.Series.Clear();
            chart1.ChartAreas[0].AxisY.CustomLabels.Clear();
            chart1.Series.Add("FirstSeries");

            // Set the type to line      
            chart1.Series["FirstSeries"].ChartType = SeriesChartType.Line;

            // Color the line of the graph light green and give it a thickness of 3
            chart1.Series[0].Color = Color.Red;
            chart1.Series[0].BorderWidth = 1;

            int minimum = 7, maximum = 300;
            chart1.ChartAreas[0].AxisY.Minimum = minimum;
            chart1.ChartAreas[0].AxisY.Maximum = maximum;
            double logMin = Math.Log(chart1.ChartAreas[0].AxisY.Minimum, 10);

            //If minimum starts from log(7) = 0.845 then take 1 which is equivalent to 100 in normal mode.
            double ceilMin = Math.Ceiling(logMin);
            double logMax = Math.Log(chart1.ChartAreas[0].AxisY.Maximum, 10);

            chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = true;
            chart1.ChartAreas[0].AxisY.MinorGrid.Enabled = true;
            chart1.ChartAreas[0].AxisY.MajorTickMark.Enabled = true;
            chart1.ChartAreas[0].AxisY.MinorTickMark.Enabled = true;

            double intervalOffset = ceilMin - logMin;
            chart1.ChartAreas[0].AxisY.LabelStyle.IntervalOffset = intervalOffset;
            chart1.ChartAreas[0].AxisY.MajorGrid.IntervalOffset = intervalOffset;
            chart1.ChartAreas[0].AxisY.MinorGrid.IntervalOffset = intervalOffset;
            chart1.ChartAreas[0].AxisY.MajorTickMark.IntervalOffset = intervalOffset;
            chart1.ChartAreas[0].AxisY.MinorTickMark.IntervalOffset = intervalOffset;

            //Setting intervals
            chart1.ChartAreas[0].AxisY.MajorGrid.Interval = 1;
            chart1.ChartAreas[0].AxisY.MajorTickMark.Interval = 1;
            chart1.ChartAreas[0].AxisY.MinorGrid.Interval = 1;
            chart1.ChartAreas[0].AxisY.MinorTickMark.Interval = 1;
            chart1.ChartAreas[0].AxisY.LabelStyle.Interval = 1;

            for (int x = minimum; x <= maximum; x += 1)
            {
                chart1.Series[0].Points.Add(x, x);
            }

            //Adding custom labels for powers of 10 for example 1,10,100 
            for (double x = minimum; x <= maximum; x+=1)
            {
                double logX = Math.Log10(x);
                double floorX = Math.Floor(logX);
                if (logX - floorX == 0)
                    chart1.ChartAreas[0].AxisY.CustomLabels.Add(logX-0.05, logX + 0.05, "" + Math.Pow(10, logX), 0, LabelMarkStyle.None);
            }

            //Adding minimum and maximum label. 0.05 factor is added by experiment.
            chart1.ChartAreas[0].AxisY.CustomLabels.Add(logMin-0.05, logMin + 0.05, "" + chart1.ChartAreas[0].AxisY.Minimum, 0, LabelMarkStyle.None);
            chart1.ChartAreas[0].AxisY.CustomLabels.Add(logMax-0.05, logMax+0.05, "" + chart1.ChartAreas[0].AxisY.Maximum, 0, LabelMarkStyle.None);

            chart1.ChartAreas[0].AxisY.IsLogarithmic = true;