我对小刻度有一个非常具体的要求。我的客户想要一个根据不同的年代具有不同数量的次要即时报价的图表。例如,如果十年小于 1,他需要 10 个标签(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 和以下次要刻度(1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5 ,9.5)
如果十年是 1 到 2,他需要以下标签(1, 2, 3, 4, 5,6, 8, 10) 和以下次要刻度 (1.5, 2.5, 3.5, 4.5, 5.5, 7, 9)
任何帮助非常感谢。我找不到如何覆盖刻度线,以便将它们放置在自定义点。不过,我已经找到了自定义标签。
谢谢
在这里回答了你。我在这里发布了最后一个也是更复杂的示例中的代码,其中使用自定义标签绘制不规则标签,并创建一个DrawMinorTick
函数来手动绘制不规则的自定义次要刻度。
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;
我已经阅读了TeeChart源代码(v2010)。没有定制的余地——没有像OnGetNextAxisLabel
那样的。
对于非对数轴,次要刻度在标签之间绘制相等的间距。
对于对数轴,次要刻度不会在标签之间绘制等距,至少对于非等间距标签是这样。事实上,我可以看到在我的代码中,我总是在使用对数轴时禁用次要刻度。我怀疑那是因为它们根本不起作用!
所以我认为你唯一的选择是自己修改源代码。