TeeChart Pro將自動爲你定義全部的軸標籤,並提供足夠的靈活性,以滿足你的任何特定需求。TeeChart Pro提供了真正的多重座標軸。這些都是在設計或運行時提供的,爲軸定義提供了無數的可能性和靈活性。有關更多信息,請參閱本教程部分。
目錄 | ||
4.1 軸控制 – 關鍵區域 (1). Scales(刻度) (2). Increment(增量) (3). Titles(標題) (4). Labels(標籤) (5). Ticks(標記) (6). Axis Position(軸位置) | 4.2 附加座標軸 (1). 複製軸 (2). 多個定製軸 | 4.3 軸事件 (1). OnClickAxis (2). OnGetAxisLabel (3). OnGetNextAxisLabel |
軸頁面共有8個子頁面:Scales(刻度)、Title(標題)、Labels(標籤)、Axis(軸)、Ticks(標記)、Grid(網格)、Position(位置)、Items(條目)
4.1 軸控制-關鍵區域
4.1.1 Scales(刻度)
當您將序列數據添加到圖表時,軸刻度會自動設置。您可以通過使用Axis屬性更改設計時或運行時的默認值。
Automatic(自動)選擇最佳的軸刻度範圍以適應您的數據。如果你關閉Automatic(自動)選項,將激活Options(選項),且可以改變座標軸的值。重要的是,記住要從頁面左邊的Axis(軸)菜單中選擇您希望配置的Axis(軸)。
在圖表中添加一個Line Series(線序列),添加一個命令按鈕,代碼如下:
procedure TForm1.BitBtn1Click(Sender: TObject); var t: Integer; begin For t := 0 To 40 do With Series1 do begin Add(Int(Random(t)), '', clRed); end; end; |
在按鈕中運行代碼將繪製一個帶有40個隨機值的Line Series(行序列)。
在設計時進入圖表編輯器。將Axis(軸)頁面底部的 Scales(刻度)頁面區域的Automatic選項“關閉”。您現在可以爲Axis刻度配置Maximum(最大值)和Minimum(最小值)。運行代碼將顯示根據您的軸配置值而再次計算的值。使用鼠標右鍵,您可以滾動查看剩餘的值。
(1) Minimum(最小數)
根據代碼設置軸刻度
您可以使用以下代碼在運行時更改最大和最小值::
With Chart1.Axes.Bottom do begin Automatic := False; Maximum := 36; Minimum ;= 5; end; |
(2) Maximum(最大數)
您可以將軸的最大值和最小值分別設置爲自動。例如:
With Chart1.Axes.Bottom do begin AutomaticMaximum := True; Minimum := 5; end; |
4.1.2 Increment(增量)
你可以調整軸的間距。從Axis(軸)頁面的Scales(刻度)部分的Increment(增量)子頁面選擇所需的Desired Incre:(期望增量)框,並添加所需的增量。也可以您可以在運行時通過代碼更改這項:
Chart1.Axes.Bottom.Increment := 20;
Datetime data(日期數據)
如果您的數據是datetime(日期型)【您可以爲你的Series(序列)數據設置爲的datetime(日期型),通過進入Series(序列)、General(一般)頁面】,圖表、Axis(軸)頁面和Scales(刻度)部分將顯示一個datetime(日期)範圍。從展示的Desired Incre:(期望增量)框中選擇範圍。
添加一些示例數據
for t := 1 To 25 do
Series1.AddXY(EncodeDate(1998, 4, t), Random(t), '', clRed);
在運行時更改增量:
Chart1.Axes.Bottom.Increment := DateTimeStep[dtOneWeek];
參看Axis.ExactDateTime屬性,可以獲得更多關於時間軸標籤的信息。
4.1.3 Title(標題)
Title有兩個子頁面:Style(樣式)、Format(格式)
標題在(軸)Axis頁面的Title(標題)部分中設置。您可以更改Axis(軸)的標題文本及其字體。這個角度可以從0、90、180、270度的值中選擇。對於運行時,可以看到TChartAxisTitle組件。
4.1.4 Labels(標籤)
標籤頁面有5個子頁面:Style(樣式)、Options(選項)、Format(格式)、Margins(邊距)、Back(背景)
注意
當頻繁改變軸的標籤時,請記住,TeeChart將根據LabelsSeparation屬性的設置來避免標籤重疊。這意味着,如果標籤改變的頻率太高,標籤就無法匹配,那麼TeeChart就會配置“最佳匹配”。改變標籤Angle(角度)和標籤Separation(間隔)是兩個選項,可以幫助你適應你需要的標籤。請參閱Labels(標籤)部分和LabelsAngle屬性。
(1) Label formats(標籤格式)
您可以將所有標準數字和日期格式應用於Axis(軸)標籤。Axis(軸)頁面,Labels(標籤)部分包含字段“Values format(值格式)”。如果您的數據是datetime(時間型),那麼字段名將更改爲“日期時間格式”。在編輯器中拖拽幫助“?“圖標放到字段上,以獲得完整的選項列表。在運行時使用:
Chart1.Axes.Bottom.AxisValuesFormat := '#,##0.00;(#,##0.00)'; //或者是Datetime數據 Chart1.Axes.Bottom.DateTimeFormat := 'dd/mmm/yy hh:mm:ss'; |
(2) MultiLine labels(多行標籤)
Axis(軸)標籤可以顯示爲多行文本,而不只是一行文本。使用TeeLineSeparator全局常量分隔行,缺省情況下是回車ASCII字符(#13)。
示例
//以這種方式添加序列標籤,並使用“Marks”作爲軸標籤樣式 Series1.Add( 1234, 'New'+TeeLineSeparator+'cars' , clRed ); Series1.Add( 2000, 'Old'+TeeLineSeparator+'bicycles' , clBlue ); |
DateTime(時間型)標籤的示例:
下面的內容將以兩行文字顯示底部軸的標籤,一行顯示月和日,另一行顯示年份:
Feb-28 Mar-1 .. 1998 1998 ..
Series1.AddXY( EncodeDate( 1998,2,28 ), 100 ); Series1.AddXY( EncodeDate( 1998,3,1 ), 200 ); Series1.AddXY( EncodeDate( 1998,3,2 ), 150 ); Series1.XValues.DateTime := True; Chart1.Axes.Bottom.DateTimeFormat := 'mm/dd hh:mm'; { <-- space } |
如果您將LabelsMultiLine屬性設置爲True,那麼axis(軸)自動的將標籤的空格處分割爲單獨的行。
Chart1.Axes.Bottom.LabelsMultiLine:=True;
把標籤分成兩份:
'mm/dd'爲第一行;
'hh:mm'爲第二行
在運行時,您可以使用OnGetAxisLabel事件以編程方式將標籤分成行:
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis; Series: TChartSeries; ValueIndex: Integer; var LabelText: String); var s:string; begin s:='abc'+TeeLineSeparator+'def'; LabelText:=ReplaceChar(s,' ',TeeLineSeparator); end; |
軸LabelsAngle的屬性(標籤旋轉度爲0、90、180或270),也可用於多行軸標籤。
(3) Customising Axis labels(定製軸標籤)
使用Axis events(軸事件)可以獲得進一步的標籤控制。事件允許你激活/禁用/改變任何個別的軸標籤。下面的例子修改了每個標籤,在點索引值前面放置一個文本短語。
//設置LabelStyle爲 'Mark',使用Tchart編輯器或使用:- Chart1.Axes.Bottom.LabelsStyle := talMark; //OnGetaxisLabel事件 procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis; Series: TChartSeries; ValueIndex: Integer; var LabelText: String); begin if Sender = Chart1.Axes.Bottom then LabelText := 'Period ' + IntToStr(ValueIndex); end; |
請參閱定名爲Axisevents(軸事件)的部分,以獲得關於使用軸事件進行定製標籤的更多信息。
4.1.5 Ticks(標記)
標記頁面有三個子頁面:Outer(外部的)、Inner(內部的)、Minor(次要的)
有3種標記類型。你可以改變每一種標記類型的長度、寬度和顏色。如果標記寬度設置爲1(默認),那麼您可以將樣式更改爲若干行類型中的一種(dot(點)、dash(破折號)等)。如果寬度大於1,樣式將被忽略。
With Chart1.Axes.Bottom do Begin TickLength := 7; Ticks.Color := clGreen; MinorTickCount := 10; //改變(主要)標記之間次要標記的數量 end; |
4.1.6 Axis position(軸位置)
軸有一個屬性,它可以修改每個軸所在的位置。在這個例子中,軸被移動到總圖表寬度的50%,所以它顯示在圖表中心:
Chart1.Axes.Left.PositionPercent := 50 ;
4.2 附加座標軸
4.2.1 複製軸
TeeChart提供了5個與數據序列相關的軸:左、頂、底、右和深。當您將一個新序列添加到一個圖表時,您可以定義該序列的哪些軸是相關的【請轉到Series(序列)選項卡,General(一般)頁面】。您可以使用軸的Customdraw方法,在圖表上的任何位置重複4個前面的軸中的任何一個(或全部)。注意,這個方法會複製您的軸,它不會添加一個新的定製軸。有關更多信息,請參閱下一節,Multiple Custom Axes(多個定製軸)。
您將找到這個名爲“CustAxisProject1”的示例,有TeeChart示例代碼:
//用隨機數據填充本例的序列 procedure TForm1.BitBtn1Click(Sender: TObject); Var t:integer; begin For t := 0 To 20 do Series1.AddXY(t, Random(100) - Random(70), '', clRed); end; //將此代碼放入Ondrawdraw Values()事件: procedure TForm1.Series1BeforeDrawValues(Sender: TObject); var posaxis :Integer; begin With Chart1 do begin If Axes.Left.Maximum > 0 Then begin //當滾動或縮放時,始終保持在圖表矩形中所包含的網格線。 Canvas.ClipRectangle(ChartRect); //總是在圖表的中間畫出第2個縱軸 posaxis := (ChartRect.Left) + (ChartRect.Right - ChartRect.Left) div 2; Axes.Left.CustomDraw(posaxis - 10, posaxis - 20, posaxis, True); //在垂直軸的10上畫出第2個水平軸 posaxis := (Axes.Left.CalcYPosValue(10)); Axes.Bottom.CustomDraw(posaxis + 10, posaxis + 40, posaxis, True); Canvas.UnClipRectangle; end; end; end; |
Custom axes(定製軸)
4.2.2 多個定製軸
PositionPercent(位置百分比)和Stretching(拉伸)屬性一起使用,在圖表上任意位置都可以有無限的座標軸。滾動、縮放和軸觸碰檢測也適用於定製創建的軸。在設計時通過圖表編輯器,和在運行時通過幾行代碼,創建額外的軸是可能的:
通過圖標編輯器
TeeChart提供了在設計時創建自定義軸的能力,使它們能夠保存在TeeChart的tee文件格式中。要實現這一點,打開Chart Editor(圖表編輯器)並單擊Axis(軸)選項卡,然後選擇“+”按鈕來添加自定義軸。然後選擇Position(位置)選項卡,確保您的新定製軸被突出顯示。這個頁面上的水平復選框允許您將新的定製軸定義爲水平軸,或者將其作爲默認的垂直軸。這個頁面的其餘部分和Axis頁面中的其他選項卡可以用來改變這些定製軸的Scales(刻度)、Increment(增量)、Titles(標題)、Labels(標籤)、Ticks標記、MinorTicks(副標記)和Position(位置)。
爲了把這新的自定義軸和你想要的Data Series(數據序列)關聯起來,選擇Series(系列)選項卡及其General(常規)頁面,下拉組合框Horizontal Axis(水平軸)和Vertical Axis(垂直軸)的將使您能夠選擇新的自定義軸,取決於你之前定義的垂直還是水平的。
通過代碼
示例:
procedure TForm1.BitBtn2Click(Sender: TObject); Var MyAxis : TChartAxis ; begin MyAxis := TChartAxis.Create( Chart1 ); Series2.CustomVertAxis := MyAxis; //您可以修改新創建的軸的任何屬性,例如axis顏色或axis標題 With MyAxis do begin Axis.Color:=clGreen ; Title.Caption := 'Extra axis' ; Title.Font.Style:=[fsBold]; Title.Angle := 90; PositionPercent := 20; //percentage of Chart rectangle end; end; |
StartPosition:=50;
EndPosition:=100;這些數字表示爲圖表矩形框的百分比,0(zero)(在垂直軸的情況下)是頂部。這些屬性可以應用到Standard Axes(標準軸)上,從而在圖表中創建完全分割的“SubCharts(子圖表)”
示例:
With Chart1.Axes.Left do begin StartPosition:=0; EndPosition:=50; Title.Caption:='1st Left Axis'; Title.Font.Style:=[fsBold]; end; |
以上兩個代碼示例結合以下數據:.
var t: integer; begin for t := 0 to 10 do begin Series1.AddXY(t,10+t,'',clTeeColor); if t > 1 then Series2.AddXY(t,t/2,'',clTeeColor); end; |
...將顯示如下圖表:
多重軸
添加自定義軸的另一種技術是通過使用List Add(列表添加),用Axis List(軸列表)作爲焦點,然後通過Index(索引)來訪問Axis(軸),如下列代碼
//添加數據到序列: procedure TForm1.FormCreate(Sender: TObject); begin Series1.FillSampleValues(10); Series2.FillSampleValues(10); end; procedure TForm1.BitBtn1Click(Sender: TObject); var tmpVertAxis: TChartAxis; tmpHorizAxis: TChartAxis; begin {Add vertical Axis} Chart1.CustomAxes.Add; tmpVertAxis:=Chart1.CustomAxes[0]; tmpVertAxis.PositionPercent:=50; Series1.CustomVertAxis:=tmpVertAxis; {Add horizontal Axis} Chart1.CustomAxes.Add; tmpHorizAxis:=Chart1.CustomAxes[1]; tmpHorizAxis.Horizontal:=True; tmpHorizAxis.Axis.Color:=clGreen; tmpHorizAxis.PositionPercent:=50; Series1.CustomHorizAxis:=tmpHorizAxis; end; |
選擇是無限的!當使用Custom Axes(自定義軸)時,我們建議小心謹慎,因爲開始用新的軸填充屏幕很容易,並且會丟失您想要管理的哪一個!
4.3 軸事件
Axis事件爲修改Axis Labels(軸標籤)提供了運行時靈活性,並在Axis上單擊時,向用戶提供交互。
4.3.1 onClickAxis
procedure TForm1.Chart1ClickAxis(Sender: TCustomChart; Axis: TChartAxis; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin //當點擊底部軸時,顯示被點擊軸的被點擊點。 if Axis = Chart1.Axes.Bottom Then ShowMessage('Clicked Bottom Axis at ' + FloatToStr(Chart1.Axes.Bottom.CalcPosPoint(X))); end; |
參看OnClickAxis事件. 示例
4.3.2 onGetAxisLabel
可用於修改Axis標籤。參看OnGetAxisLabel事件。
示例
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis; Series: TChartSeries; ValueIndex: Integer; var LabelText: String); begin if Sender = Chart1.Axes.Bottom Then Case StrToInt(FormatDateTime('mm', StrToDate(LabelText))) of 1,2,3 : LabelText := '1st Qtr'; 4,5,6 : LabelText := '2nd Qtr'; end; end; |
4.3.3 onGetNextAxisLabel
可以用來決定應該顯示哪些Axis標籤。參看OnGetNextAxisLabel事件。您應該使用Stop Boolean屬性來包含/排除Axis標籤。
示例
procedure TForm1.Chart1GetNextAxisLabel(Sender: TChartAxis; LabelIndex: Integer; var LabelValue: Double; var Stop: Boolean); begin Stop:=False; if Sender = Chart1.Axes.Bottom Then begin if LabelValue>=5 then LabelValue:=LabelValue+5 else LabelValue:=5; end else Stop:=True; end; |
上面的例子將在底部軸“5”上開始加標籤,每5點加一個。其他軸的標籤不受影響。
第四章完