【问题标题】:Is an exponential scale of an axis with TDBChart possible?带有 TDBChart 的轴的指数比例是否可能?
【发布时间】:2016-03-05 14:28:46
【问题描述】:

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

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

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

那么,是否有可能使用 TDBChart 以指数方式缩放轴?

【问题讨论】:

  • 注意指数是对数的倒数。如果轴上的对数属性没有给出您期望的结果,请安排sscce
  • @Yeray:是的,我知道指数和对数刻度之间的联系。问题不在于数学基础。在 TDBChart 中有一个内置选项可以使用对数刻度。我想知道是否可以将 TDBChart 中的轴操作为具有指数(通常是任意)比例,或者是否有必要更改 TDBChart 的源代码来实现这一点。

标签: delphi teechart delphi-10-seattle


【解决方案1】:

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

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);

【讨论】:

  • 谢谢!但这不是我需要的。 (我需要Chart1.Axes.Left.Exponential:=true; 之类的东西)我已经为上面的问题添加了更多细节。
  • 感谢您的帮助!其实,我错了。第二个例子不是指数规模。它是对数的,但仅从 1.2 开始! 0.1 和 1.2 之间的图形被挤在一起。确实,很奇怪。
猜你喜欢
  • 2021-11-12
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多