Delphi 具有TDBChart的轴的指数标度是否可能?

Delphi 具有TDBChart的轴的指数标度是否可能?,delphi,teechart,delphi-10-seattle,Delphi,Teechart,Delphi 10 Seattle,是否可以使用TDBChart的轴的指数刻度(而不是对数刻度) 当图形对应于指数增长时,y轴的对数刻度非常有用。如以下示例所示,图中0到1之间的y轴值会额外突出显示,而超出该值的个别异常值将变得越来越不重要: 但是,如果与上面的示例相比,图有某种相反的行为,其中小值不是很重要(噪声),但个别异常值应该显式可见,那么指数尺度是有用的: 那么,可以用TDBChart指数缩放轴吗?以下代码用指数数据填充一系列数据: uses Series, Math; procedure TForm1.FormC

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

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

但是,如果与上面的示例相比,图有某种相反的行为,其中小值不是很重要(噪声),但个别异常值应该显式可见,那么指数尺度是有用的:


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

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

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;
结果如下:


然后,如果将以下代码添加到上述代码中:

  Chart1.Axes.Left.Logarithmic:=true;
现在数据仍然相同,但左轴比例更改为对数比例:


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

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


编辑:

将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;
看起来是这样的:

0.1和1.2之间的距离比屏幕截图中的要大得多,我不确定这是错误还是数学上正确。
我可以将轴比例更改为从1开始,而不是从0.1开始,使其看起来与您的屏幕截图非常相似,但我不确定这是否是您想要的:

      SetMinMax(1, 100);

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

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;
结果如下:


然后,如果将以下代码添加到上述代码中:

  Chart1.Axes.Left.Logarithmic:=true;
现在数据仍然相同,但左轴比例更改为对数比例:


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

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


编辑:

将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;
看起来是这样的:

0.1和1.2之间的距离比屏幕截图中的要大得多,我不确定这是错误还是数学上正确。
我可以将轴比例更改为从1开始,而不是从0.1开始,使其看起来与您的屏幕截图非常相似,但我不确定这是否是您想要的:

      SetMinMax(1, 100);

注意:指数是对数的倒数。如果轴上的对数属性没有给出您期望的结果,请安排@Yeray:是的,我知道指数和对数标度之间的联系。问题不在于数学基础。在TDBChart中,有一个内置选项,可以使用对数刻度。我想知道是否有可能操纵TDBChart中的轴以获得指数(通常为任意)刻度,或者是否有必要更改TDBChart的源代码以实现这一点。请注意,指数是对数的倒数。如果轴上的对数属性没有给出您期望的结果,请安排@Yeray:是的,我知道指数和对数标度之间的联系。问题不在于数学基础。在TDBChart中,有一个内置选项,可以使用对数刻度。我想知道是否有可能操纵TDBChart中的轴以获得指数(通常为任意)刻度,或者是否有必要更改TDBChart的源代码以实现这一点。谢谢!但这不是我需要的。(我需要类似于
Chart1.Axes.Left.Exponential:=true;
)的内容,我已为上述问题添加了其他详细信息。感谢您的帮助!事实上,我错了。第二个例子不是指数尺度。它是对数的,但只从1.2开始!0.1和1.2之间的图形被压缩在一起。的确,很奇怪。谢谢!但这不是我需要的。(我需要类似于
Chart1.Axes.Left.Exponential:=true;
)的内容,我已为上述问题添加了其他详细信息。感谢您的帮助!事实上,我错了。第二个例子不是指数尺度。它是对数的,但只从1.2开始!0.1和1.2之间的图形被压缩在一起。的确,很奇怪。