我想创建十进制对数y轴,如第一张图所示。第一张图片具有78作为对数y轴的最小值。然后它显示10的幂的其他轴值,如100和1000.最后,它显示对数y轴的最大值。第一个图形不是使用MS Chart控件开发的。
第二张图中的图表是使用MS Chart控件开发的。在第二个图中,我无法以10的幂显示轴值,例如100和1000,类似于第一个图。我使用下面的代码来创建此图。
axis.MinorGrid.Interval = 1;
axis.MinorTickMark.Interval = 1;
axis.MajorGrid.Interval = 1;
axis.MajorTickMark.Interval = 1;
我想创建类似于第一张图的第二张图
答案 0 :(得分:0)
经过努力,我找到了解决这个问题的方法。为了显示10的幂的对数y轴值,需要为标签设置间隔偏移。也可以相应地设置主要网格和次要网格。例如,在图2中,最小值为78.53。因此,如果我们想要显示100,我们需要设置21.47的偏移量。要计算偏移量,我必须执行计算
100 - 78.53 = 21.47。
既然我们正在处理y轴的对数值,我们需要以对数值执行此计算
Offset = log(100) - log(78.53)
如果我们将图片2中的上述偏移设置为轴标签样式,主要和次要网格,那么第一个标签和网格将从100开始,然后根据需要从1000,10000开始。标签样式,主要和次要网格的间隔应设置为1,表示1年。
现在第二个问题是如何显示图表的最小值和最大值。默认情况下,MS Chart不会显示这些值。我们需要处理自定义标签以显示最小值和最大值以及介于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;