Page 1 of 1

minor ticks at arbitrary positions logarithmic scale?

Posted: Sun Dec 16, 2012 12:51 am
by 10547025
First of, excuse my ignorance of logarithmic scales, but I have a very specific request regarding minor ticks. My client want a graph with a different number of minor ticks according to different decades. For example, if the decade is less than 1 he wants 10 labels(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) and the following minor ticks (1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5 ,9.5)

If the decade is 1 to 2, he wants the following labels(1, 2, 3, 4, 5, 6, 8, 10) and the following minor ticks (1.5, 2.5, 3.5, 4.5, 5.5, 7, 9)

If the decade is 2 to 3, he wants the following labels(1, 2, 3, 4, 7, 10) and the following minor ticks (1.5, 2.5, 5, 6, 8, 9)

Any help much appreciated. I can't find how to override the tick marks so I can place them at custom points. I have figured out custom labels though.

Thanks

Re: minor ticks at arbitrary positions logarithmic scale?

Posted: Mon Dec 17, 2012 12:12 pm
by yeray
Hi Errol,
Errol wrote:if the decade is less than 1 he wants 10 labels(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) and the following minor ticks (1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5 ,9.5)
I'm not sure about what do you mean with the "decade", but here you have an example of how you could have labels at 1, 2, 3,... and a minor tick between each 2 labels:

Code: Select all

uses Series;

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

  Chart1.AddSeries(TFastLineSeries).FillSampleValues(10);
  for i:=0 to Chart1[0].Count-1 do
    Chart1[0].XValue[i]:=i+1;

  Chart1.Axes.Bottom.SetMinMax(1, 10);
  Chart1.Axes.Bottom.MinorTickCount:=1;
end;
Errol wrote:If the decade is 1 to 2, he wants the following labels(1, 2, 3, 4, 5, 6, 8, 10) and the following minor ticks (1.5, 2.5, 3.5, 4.5, 5.5, 7, 9)
Here we have non-equidistant labels, so we should use custom labels. The minor ticks are drawn where you want for me here:

Code: Select all

uses Series;

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

  Chart1.AddSeries(TFastLineSeries).FillSampleValues(10);
  for i:=0 to Chart1[0].Count-1 do
    Chart1[0].XValue[i]:=i+1;

  Chart1.Axes.Bottom.Items.Clear;
  for i:=1 to 6 do
    Chart1.Axes.Bottom.Items.Add(i, IntToStr(i));

  Chart1.Axes.Bottom.Items.Add(8, '8');
  Chart1.Axes.Bottom.Items.Add(10, '10');

  Chart1.Axes.Bottom.MinorTickCount:=1;
end;
Errol wrote:If the decade is 2 to 3, he wants the following labels(1, 2, 3, 4, 7, 10) and the following minor ticks (1.5, 2.5, 5, 6, 8, 9)
Here the minor ticks are also irregular, so in the example below I used custom labels (like above) and I'm implemented a DrawMinorTick method to draw the custom minor ticks manually:

Code: Select all

uses Series, TeCanvas;

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

  Chart1.AddSeries(TFastLineSeries).FillSampleValues(10);
  for i:=0 to Chart1[0].Count-1 do
    Chart1[0].XValue[i]:=i+1;

  Chart1.Axes.Bottom.Items.Clear;
  for i:=1 to 4 do
    Chart1.Axes.Bottom.Items.Add(i, IntToStr(i));

  Chart1.Axes.Bottom.Items.Add(7, '7');
  Chart1.Axes.Bottom.Items.Add(10, '10');

  Chart1.Axes.Bottom.MinorTickCount:=0;
end;

procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
  DrawMinorTick(Chart1.Axes.Bottom, 1.5);
  DrawMinorTick(Chart1.Axes.Bottom, 2.5);
  DrawMinorTick(Chart1.Axes.Bottom, 5);
  DrawMinorTick(Chart1.Axes.Bottom, 6);
  DrawMinorTick(Chart1.Axes.Bottom, 8);
  DrawMinorTick(Chart1.Axes.Bottom, 9);
end;

procedure TForm1.DrawMinorTick(axis: TChartAxis; value: double);
var XPos, YPos: Integer;
begin
  Chart1.Canvas.Pen.Color:=axis.MinorTicks.Color;
  Chart1.Canvas.Pen.Width:=axis.MinorTicks.Width;
  Chart1.Canvas.Pen.Style:=axis.MinorTicks.Style;
  if axis.Horizontal then
  begin
    XPos:=axis.CalcPosValue(value);
    YPos:=axis.PosAxis+1;
    Chart1.Canvas.Line(XPos, YPos, XPos, YPos+axis.MinorTickLength);
  end
  else
  begin
    XPos:=axis.PosAxis;
    YPos:=axis.CalcPosValue(value);
    Chart1.Canvas.Line(XPos, YPos, XPos-axis.MinorTickLength, YPos);
  end;
end;

Re: minor ticks at arbitrary positions logarithmic scale?

Posted: Mon Dec 17, 2012 9:54 pm
by 10547025
Thanks for the code, will check it out and report back (no pun intended)