是否可以使用TDBChart的轴的指数刻度?

时间:2016-03-05 14:28:47

标签: delphi teechart delphi-10-seattle

是否可以使用TDBChart(而不是对数刻度)得到轴的指数刻度?

当图形对应于指数增长时,y轴的对数标度是有用的。如下例所示,0和1之间的图形的y轴值被额外突出显示,而超出该值的单个异常值将变得越来越不重要:

然而,如果与上面的例子相比,图形具有某种逆行为,其中小值不是非常重要(噪声)但是应该明确地看到单个异常值,那么指数标度是有用的:

那么,是否可以用TDBChart指数缩放轴?

1 个答案:

答案 0 :(得分:2)

以下代码使用指数数据填充系列:

uses Series, Math;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  Chart1.View3D:=False;
  Chart1.Legend.Visible:=false;

  with Chart1.AddSeries(TLineSeries) as TLineSeries do
  begin
    Pointer.Visible:=true;
    Pointer.Size:=2;

    for i := 1 to 10 do
      Add(Power(2, i));
  end;
end;

结果如下:

exponential growth

然后,如果您将以下代码添加到上面:

  Chart1.Axes.Left.Logarithmic:=true;

现在数据仍然相同,但左轴刻度变为对数刻度:

logarithmic scale

您还可以更改标签格式,即:

  Chart1.Axes.Left.AxisValuesFormat:='00e-0';
  Chart1.Axes.Left.LabelsExponent:=true;

exponential labels

修改

在TeeChart上设置1.544的对数基数和自定义标签,以在屏幕截图中显示这些标签:

uses Series, Math;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  Chart1.View3D:=False;
  Chart1.Legend.Visible:=false;

  with Chart1.AddSeries(TLineSeries) as TLineSeries do
  begin
    Pointer.Visible:=true;
    Pointer.Size:=2;

    for i := 1 to 7 do
      Add(Power(2, i));
  end;

  with Chart1.Axes.Left do
  begin
    Logarithmic:=True;
    LogarithmicBase:=1.544;
    MinorTicks.Visible:=false;

    with Items do
    begin
      Clear;
      Add(0.1, '0.1');
      Add(1.2, '1.2');
      Add(1.5, '1.5');
      Add(2, '2');
      Add(3, '3');
      Add(5, '5');
      Add(7, '7');
      Add(10, '10');
      Add(15, '15');
      Add(20, '20');
      Add(30, '30');
      Add(40, '40');
      Add(50, '50');
      Add(70, '70');
      Add(100, '100');

      SetMinMax(0.1, 100);
    end;
  end;
end;

看起来像这样:

LogarithmicBase 1.544

0.1到1.2之间的距离远远大于屏幕截图中的距离,我不确定这是一个错误还是数学错误。
我可以将轴刻度更改为从1开始而不是0.1,使其看起来与截图类似,但我不确定这是否符合您的要求:

      SetMinMax(1, 100);

Axis Minimum 1)