内容 | ||
6.1 Series(序列)类型 Series(序列)类结构 选择一个序列类型 向序列中添加数据 从一个序列中删除数据点 向序列中添加Null(空)点 | 6.2 图表上混合序列类型 添加新的序列 为序列选择坐标轴 连接序列 改变序列顺序 | 6.3 序列值列表 访问序列值 使用值的示例 |
6.1 Series(序列)类型
6.1.1 Series(序列)类结构
在设计时使用 TChart 编辑器更容易添加序列,但是您也可以在运行时创建和添加新的和不同的系列类型到同一个图表中。
//你可以在运行时添加序列
procedure TForm1.Button2Click(Sender: TObject);
var tmpAreaSeries:TAreaSeries;
begin
tmpAreaSeries:=TAreaSeries.Create(self);
With tmpAreaSeries do
begin
ParentChart:=Chart1;
FillSampleValues(10);
end;
end;
6.1.2 选择一个序列类型
为图表选择一个序列类型将很大程度上取决于您对图表的需求。然而,在有些情况下,图表的选择取决于哪个序列类型支持输入变量的数量,因为需要大量的变量来绘制。下表显示了一些不同的序列类型所允许的变量的数量。在这个简短的教程中,我们没有列出TeeChart图表的所有可能的序列类型。
序列类型 | 变量数量 | Datasource 属性 |
1) 标准(Standard) |
|
|
Line(线) | 2 | XValues, YValues, XLabel |
Bar(棒) | 2 | XValues, YValues (called Bar), XLabel |
HorizBar(水平棒) | 2 | XValues, YValues (called Bar), XLabel |
Area(面积图) | 2 | XValues, YValues, XLabel |
Point(点) | 2 | Xvalues, YValues, XLabel |
Pie(饼图) | 1 | PieValues, XLabel |
Fast Line(快速线) | 2 | XValues, YValues, XLabel |
Horiz. Line(水平线) | 2 | XValues, YValues, YLabel |
Horiz. Area(水平面积) | 2 | XValues, YValues, XLabel |
Shape(形状) | 4 | X0 (Top), Y0 (Bottom), X1 (Left), Y1 (Right) |
Bubble(气泡) | 3 | Xvalues, YValues, XLabel, RadiusValues |
Gantt(甘特图) | 3 | StartValues, EndValues, AY (Y axis level), AXLabel (标签可选地显示在y轴或标记上 |
2) 扩展(Extended) |
|
|
Arrow(箭头) | 4 | StartXValues, StartYValues, XLabel, EndXValues, EndYValues |
Polar(极坐标) | 2 | XValues, YValues, Labels (Polar has Angle and Radius) |
Radar(雷达) | 2 | XValues, YValues, Labels (Radar has Angle and Radius) |
Bezier(贝塞尔曲线) | 2 | XValues, YValues, XLabel |
Donut(圆环) | 2 | Angle, YValue, Labels |
Smith(史密斯图) | 2 | Resistance, Reactance, Labels |
Pyramid(棱锥) | 3 | XValues, YValues, XLabel, ErrorValues |
3) 金融(Financial) |
|
|
Candle (蜡烛线) | 5 | OpenValues, CloseValues, HighValues, LowValues, DateValues |
Point & Figure(点数图) | 5 | OpenValues, CloseValues, HighValues, LowValues, DateValues |
Volume(容量图) | 2 | XValues, YValues (VolumeValues), XLabel |
4) 统计(Stats) |
|
|
Histogram(直方图) | 2 | Xvalues, YValues, XLabel |
Error Bar(误差棒) | 3 | XValues, YValues, XLabel, StdErrorValues |
Error(误差) | 3 | XValues, YValues, XLabel, StdErrorValues |
High-Low(高低图) | 3 | XValues, YValues, XLabel, LowValues |
Box Plot(箱形图) | 3 | XValues, SamplesValues, Label |
Horizontal Box Plot(水平箱形图) | 3 | XValues, SamplesValues, Label |
Funnel(漏斗) | 3 | XValues, QuoteValues, OpportunityValues, XLabel |
5) 3D |
|
|
Surface(曲面) | 3 | Xvalues, YValues, ZValues |
Contour(等高线) | 3 | XValues, YValues, ZValues, XLabel |
Waterfall(瀑布) | 3 | Xvalues, YValues, ZValues |
ColorGrid(颜色格) | 3 | XValues, YValues, ZValues |
Tower(塔) | 3 | XValues, YValues, XLabel, ZValues |
Point3D(3D点) | 3 | XValues, YValues, XLabel, ZValues |
Triangle Surf.(三角形曲面) | 3 | Xvalues, YValues, ZValues |
6) Other(其它) |
|
|
Clock(时钟) | 2 | Angle, YValues, Labels |
Line Point(点线图) | 2 | XValues, YValues, XLabel |
Bar Join(棒连接) | 2 | Xvalues, YValues, XLabel |
Bar3D(3D棒) | 3 | XValues, YValues, YStartPoint, XLabel |
WindRose(风玫瑰图) | 2 | Angle, YValues, Labels |
Calendar(日历) | 2 | XValues, YValues, Labels |
7) Gauges(仪表) |
|
|
Gauge(仪表) | 1 | Value |
标签可用于扩展2个变量序列类型的值。请参见下面的示例,该示例使用了相同图表中的Bar序列类型的3个实例。
示例:
使用Bar序列类型
产品代码 | 月 | 生产数量 |
10 | Jan | 300 |
10 | Feb | 325 |
10 | Mar | 287 |
12 | Jan | 175 |
12 | Feb | 223 |
12 | Mar | 241 |
14 | Jan | 461 |
14 | Feb | 470 |
14 | Mar | 455 |
在最简单的形式下,数据生成如下图表,按月分组:
或者是 (按产品分组):
我们在上面的表中添加了新的值(存货)后如下表。
产品代码 | 月 | 生产数量 | 存货水平 |
10 | Jan | 300 | 600 |
10 | Feb | 325 | 715 |
10 | Mar | 287 | 676 |
12 | Jan | 175 | 245 |
12 | Feb | 223 | 270 |
12 | Mar | 241 | 315 |
14 | Jan | 461 | 800 |
14 | Feb | 470 | 755 |
14 | Mar | 455 | 835 |
存货的数值通常高于月产量,所以显示它们,给出了下面的图表(这次是2D)。该图表使用Line Series(线序列)来区分存货。
6.1.3 向序列中添加数据
大多数序列类型(除了ODBC数据源教程8和函数教程7)都使用Add和ADDXY方法来添加数据。有一些例外,请参见下面的表格,以说明它们的区别:
序列类型 | 添加序列点 | 删除序列点 |
|
|
|
标准序列类型 |
|
|
Line(线) | Series.Add Series.AddXY Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Horiz Line(水平线) | Series.Add Series.AddXY Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Fast Line(快速线) | Series.Add Series.AddXY Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Bar(棒) | Series.Add Series.AddXY Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
HorizBar(水平棒) | Series.Add Series.AddXY Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Area(面积) | Series.Add Series.AddXY Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Point(点) | Series.Add Series.AddXY Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Pie(饼) | Series.Add Series.AddNull | Series.Delete Series.Clear |
Arrow(箭头) | ArrowSeries.AddArrow Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Bubble(气泡) | BubbleSeries.AddBubble Series.AddNull Series.AddNullXY | Series.Delete Series.Clear |
Gantt(甘特图) | GanttSeries.AddGantt GanttSeries.AddGanttColor | Series.Delete Series.Clear |
Shape(形状) | ShapeSeries.X0, ShapeSeries.Y0, ShapeSeries.X1, ShapeSeries.Y1 | TChart.RemoveSeries (TCustomAxisPanel) (每个形状都是一个独一无二的系列) |
Colour
在添加点时,可以手动添加颜色
示例:Series1.Add(46,'My first value', clYellow);
另一种选择是使用TeeChart常量clTeeColor,告诉TeeChart图表来分配颜色。在每一个新序列中,TeeChart将选择最多16种独特的、尚未使用的颜色。
示例:Series1.Add(46, 'My firstvalue', clTeeColor);
6.1.4 从一个序列中删除数据点
使用Series.Delete从一个序列中删除一个点。
示例:Series1.Delete(7); //(第8点--点索引从0开始)
Series.Clear从一个序列中清除所有点。
6.1.5 向序列中添加Null(空)点
请参见表“向序列中添加数据”,此表是为一个支持AddNull方法的序列类型的列表。正如名称所示,AddNull将为该系列添加一个空点,允许您为该点定义一个标签,但在该序列中的那个点的位置留下一个间断。在线序列的情况下,间断前的最后一点不会连接到间断后的第一个点。参看到Series.AddNull。
示例:Series1.AddNull('my nullvalue');
6.2 在图表中混合序列类型
TeeChart Pro向数据序列提供了一个空白的图表画布作为背景。这意味着没有图表类型被定义。您可以将需要显示的图表类型定义为各种序列类型的组合。由于某些序列类型的特殊性,一些序列类型在一个图表上进行组合是不切实际的。当你要添加一个新序列的时候,TeeChart会帮助你将图表画廊中不适合的序列类型变成灰色。可以在图表上放置的序列数量没有限制。
6.2.1 添加新的序列
使用图表编辑器(参见教程1)或代码添加一个序列。
示例:
procedure TForm1.Button2Click(Sender: TObject);
var tmpLineSeries:TLineSeries;
begin
tmpLineSeries:=TLineSeries.Create(self);
Chart1.AddSeries(tmpLineSeries);
tmpLineSeries.FillSampleValues(10);
end;
6.2.2 为序列选择坐标轴
添加到图表中的序列将自动地把左侧和底部坐标轴作为它们的参考坐标轴。您可以在图表编辑器中通过选择Series General(序列常规)页面来更改相关序列的参考轴。有4个轴可用,顶、左、底和右。通过代码,改变坐标轴是这样的:
With Series1 do
begin
HorizAxis := aTopAxis;
VertAxis := aRightAxis;
end;
超过1个序列可以与每个轴相关联。在这个系列中,TeeChart将决定最佳的刻度来匹配坐标轴,但是你可以自己改变轴的刻度(见坐标轴教程)。可以添加额外的轴,它们将复制与他们对应的第一序列的4个轴相关联的比例(请参阅教程部分额外的坐标轴)。
6.2.3 连接序列
您可以使用一个序列作为另一个序列的数据源。通过为第二个序列设置数据源,可以使用图表编辑器完成这一操作。转到Series(序列)选项卡,Datasource(数据源)页面。选择“Function(函数)”作为数据源类型。两个列表框将出现,可用的序列和选择的序列。选择您希望用作本序列数据源的序列,然后,在上面的Combobox(组合框)中,标题为Function:(函数:),选择Copy(复制)作为函数类型。请注意,以这种方式,任何序列都可以定义为其他序列的函数,函数类型可能是函数组合框中可用的列表中的任意一个。按照下面的代码做同样的事情:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
With Series2 do
begin
Datasource:=Series1;
SetFunction(TAverageTeeFunction.Create(Self));
FunctionType.Period := 4;
CheckDatasource;
end
end;
有关如何使用TeeChart函数的更多信息,请参见教程7—使用函数。
6.2.4 改变序列顺序
在图表编辑器中改变序列顺序是非常容易的。转到编辑器的首页,高亮显示你想要移动的序列。使用右边的箭头按钮在序列中上下移动序列顺序。序列顺序将决定本序列的相对显示位置。通过代码使用SeriesList属性或ExchangeSeries方法。
示例: Chart1.ExchangeSeries(0,1); //Change Series(0) with Series(1) inthe index order
*请注意。交换序列之后,该序列的索引将被更改。因此,如果代码重新运行,那么上面的代码将永远交换2个系列的“0”和“1”,因为0变成了1,而1变成了0。
将一个序列设置为“Active:=False”将把该序列从图表中隐藏,但保持其数据内容的完整性。
6.3 序列值列表
TeeChart序列产品将其值存储在可访问的值列表中,并可通过TChartValueList组件进行修改。
6.3.1 访问序列值
您可以访问列表中的任何值:
示例: ShowMessage(FloatToStr(Series1.XValues[3])); // 在 Series1 中显示第 4 点的值 ( 索引从 0 开始 )以这种方式访问的值可被用于在序列数据上设置陷阱条件:
With Series1 do
begin
For t := 0 To Count - 1 do
begin
If YValues[t] > 9 Then
ShowMessage('Value: ' + FloatToStr(XValues[t]) + ', ' + FloatToStr(YValues[t]) + ' exceeds limit');
end;
同样的值可以通过一些序列方法和几个图表事件所使用的点ValueIndex来获得。
示例:
procedure TForm1.Series1Click(Sender: TChartSeries; ValueIndex: Integer;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Showmessage('ValueIndex is: ' + IntToStr(ValueIndex));
Showmessage('Point''s Y value is: ' + FloatToStr(Sender.YValues.Value[ValueIndex]));
Chart1.CancelMouse:=True; //使用CancelMouse来防止缩放事件激活
end;
注意,当点击3D序列时,只有在前平面上的点击才会被识别为序列的点击。
6.3.2 使用值的例子
这个代码根据用户的鼠标操作修改了一个BarSeries条的值。
示例:
//使用OnClickSeries或OnClickBackground事件来确定用户点击的位置。
procedure TForm1.Chart1ClickBackground(Sender: TCustomChart;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
If (Int(Chart1.Axes.Bottom.CalcPosPoint(X)) > -1) Then
Case Ord(Button) of
0 : UpdatePoint(Chart1.Axes.Bottom.CalcPosPoint(X), Chart1.Axes.Left.CalcPosPoint(Y));
end;
end;
procedure TForm1.Series1Click(Sender: TChartSeries; ValueIndex: Integer;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
UpdatePoint(ValueIndex, Chart1.Axes.Left.CalcPosPoint(Y));
Chart1.CancelMouse:=True; //使用CancelMouse来防止缩放事件激活
end;
在这两种情况下,调用UpdatePoint子例程来修改该条棒的值:
Procedure TForm1.UpdatePoint(Bar, Y : Double);
begin
If Round(Bar) < Series1.Count Then
begin
Series1.YValues[Round(Bar)] := Int(Y);
Chart1.refresh;
end;
end;
第六章 完