TChart的属性和用法
<p>Lazarus 中的 TChart 组件(来自 TAChart 包)是一个功能强大的图表绘制组件。以下是其主要的属性和用法详解:</p>
<h2>一、基本属性</h2>
<h3>1. 常用属性</h3>
<pre><code class="language-pascal">// 基本外观
Chart1.Title.Text.Text := &#039;图表标题&#039;; // 图表标题
Chart1.Title.Visible := True; //显示标题
Chart1.Foot.Text.Text := &#039;图表脚注&#039;; // 脚注
Chart1.BackColor := clWhite; // 背景色
Chart1.Gradient.Visible := False; // 渐变背景
// 图区边框
Chart1.Frame.Visible := True; // 显示边框
Chart1.Frame.Color := clBlack; // 边框颜色
Chart1.Frame.Width := 1; // 边框宽度</code></pre>
<h3>2. 坐标轴属性</h3>
<pre><code class="language-pascal">// X轴 (BottomAxis)
Chart1.BottomAxis.Title.Caption := &#039;X轴&#039;; // 轴标题
Chart1.BottomAxis.Title.Visible := True;
Chart1.BottomAxis.Grid.Visible := True; // 网格线
Chart1.BottomAxis.Marks.Visible := True; // 刻度标签
Chart1.BottomAxis.Range.Max := 50; //和下面属性一样效果,差异是什么?
Chart1.BottomAxis.Range.UseMax :=True;
Chart1.Extent.UseXMax := True; //启用X轴最大值
Chart1.Extent.Xmax :=50; //X轴最大值
// Y轴 (LeftAxis)
Chart1.LeftAxis.Title.Caption := &#039;Y轴&#039;;
Chart1.LeftAxis.Grid.Visible := True;
// 设置范围??
Chart1.BottomAxis.Automatic := False;
Chart1.BottomAxis.Minimum := 0;
Chart1.BottomAxis.Maximum := 100;</code></pre>
<h2>二、图表序列(Series)</h2>
<h3>1. 常用序列类型</h3>
<pre><code class="language-pascal">var
LineSeries: TLineSeries;
BarSeries: TBarSeries;
PieSeries: TPieSeries;
AreaSeries: TAreaSeries;
begin
// 线图
LineSeries := TLineSeries.Create(Chart1);
Chart1.AddSeries(LineSeries);
// 柱状图
BarSeries := TBarSeries.Create(Chart1);
Chart1.AddSeries(BarSeries);
// 饼图
PieSeries := TPieSeries.Create(Chart1);
Chart1.AddSeries(PieSeries);
// 面积图
AreaSeries := TAreaSeries.Create(Chart1);
Chart1.AddSeries(AreaSeries);
end;</code></pre>
<h3>2. 添加数据</h3>
<pre><code class="language-pascal">// 基本添加数据
LineSeries.AddXY(1, 10);
LineSeries.AddXY(2, 25);
LineSeries.AddXY(3, 15);
LineSeries.AddXY(4, 30);
// 添加带标签的数据
LineSeries.AddXY(5, 20, &#039;点5&#039;);
// 批量添加数据
var
i: Integer;
begin
for i := 1 to 10 do
LineSeries.AddXY(i, Random(100));
end;</code></pre>
<h2>三、完整示例</h2>
<h3>1. 创建线图</h3>
<pre><code class="language-pascal">procedure TForm1.CreateLineChart;
var
LineSeries: TLineSeries;
i: Integer;
begin
// 清除现有序列
Chart1.ClearSeries;
// 创建线序列
LineSeries := TLineSeries.Create(Chart1);
Chart1.AddSeries(LineSeries);
// 设置序列属性
LineSeries.Title := &#039;数据线&#039;;
LineSeries.SeriesColor := clBlue;
LineSeries.LinePen.Width := 2;
LineSeries.ShowPoints := True;
LineSeries.Pointer.Brush.Color := clRed;
LineSeries.Pointer.Style := psCircle;
// 添加数据
for i := 1 to 20 do
LineSeries.AddXY(i, Sin(i * 0.5) * 50 + 50);
// 设置图表属性
Chart1.Title.Text.Text := &#039;正弦波形图&#039;;
Chart1.BottomAxis.Title.Caption := &#039;时间&#039;;
Chart1.LeftAxis.Title.Caption := &#039;幅度&#039;;
// 设置范围
Chart1.BottomAxis.Automatic := False;
Chart1.BottomAxis.Minimum := 1;
Chart1.BottomAxis.Maximum := 20;
end;</code></pre>
<h3>2. 创建柱状图</h3>
<pre><code class="language-pascal">procedure TForm1.CreateBarChart;
var
BarSeries: TBarSeries;
begin
Chart1.ClearSeries;
BarSeries := TBarSeries.Create(Chart1);
Chart1.AddSeries(BarSeries);
BarSeries.AddXY(1, 45, &#039;一月&#039;);
BarSeries.AddXY(2, 68, &#039;二月&#039;);
BarSeries.AddXY(3, 32, &#039;三月&#039;);
BarSeries.AddXY(4, 89, &#039;四月&#039;);
BarSeries.AddXY(5, 56, &#039;五月&#039;);
BarSeries.BarBrush.Color := clSkyBlue;
BarSeries.BarPen.Color := clNavy;
BarSeries.BarWidthPercent := 50;
Chart1.Title.Text.Text := &#039;月度销售数据&#039;;
end;</code></pre>
<h2>四、高级功能</h2>
<h3>1. 多序列图表</h3>
<pre><code class="language-pascal">procedure TForm1.CreateMultiSeriesChart;
var
Series1, Series2: TLineSeries;
i: Integer;
begin
Chart1.ClearSeries;
// 第一个序列
Series1 := TLineSeries.Create(Chart1);
Chart1.AddSeries(Series1);
Series1.Title := &#039;实际值&#039;;
Series1.SeriesColor := clBlue;
// 第二个序列
Series2 := TLineSeries.Create(Chart1);
Chart1.AddSeries(Series2);
Series2.Title := &#039;预测值&#039;;
Series2.SeriesColor := clRed;
Series2.LineType := ltNone;
Series2.ShowPoints := True;
Series2.Pointer.Style := psDiamond;
// 添加数据
for i := 1 to 10 do
begin
Series1.AddXY(i, Random(50) + 25);
Series2.AddXY(i, Random(50) + 30);
end;
// 显示图例
Chart1.Legend.Visible := True;
end;</code></pre>
<h3>2. 实时数据更新</h3>
<pre><code class="language-pascal">procedure TForm1.Timer1Timer(Sender: TObject);
var
x, y: Double;
begin
if Chart1.SeriesCount &gt; 0 then
begin
// 获取最后一个点的X值
with Chart1.Series[0] as TLineSeries do
begin
if Count &gt; 0 then
x := GetXValue(Count-1) + 1
else
x := 1;
y := Random(100);
AddXY(x, y);
// 保持显示最近20个点
if Count &gt; 20 then
Delete(0);
end;
end;
end;</code></pre>
<h3>3. 图表交互</h3>
<pre><code class="language-pascal">procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
xValue, yValue: Double;
begin
// 将像素坐标转换为图表坐标
xValue := Chart1.BottomAxis.ImageToGraph(X);
yValue := Chart1.LeftAxis.ImageToGraph(Y);
StatusBar1.SimpleText := Format(&#039;X: %.2f, Y: %.2f&#039;, [xValue, yValue]);
end;</code></pre>
<h2>五、图例和标签</h2>
<pre><code class="language-pascal">// 图例设置
Chart1.Legend.Visible := True;
Chart1.Legend.Alignment := laBottomRight; // 位置
Chart1.Legend.Frame.Visible := True; // 边框
// 数据点标签
LineSeries.Marks.Visible := True;
LineSeries.Marks.Style := smsLabel; // 显示标签
LineSeries.Marks.Format := &#039;%.1f&#039;; // 格式</code></pre>
<h2>六、保存和导出</h2>
<pre><code class="language-pascal">// 保存为图片
procedure TForm1.SaveChartAsImage;
begin
Chart1.SaveToFile(TPortableNetworkGraphic, &#039;chart.png&#039;);
// 或
Chart1.SaveToFile(TPortableNetworkGraphic, &#039;chart.bmp&#039;);
// 或
Chart1.SaveToFile(TPortableNetworkGraphic, &#039;chart.jpg&#039;);
end;</code></pre>
<h2>七、常用事件</h2>
<pre><code class="language-pascal">// 点击数据点
procedure TForm1.Chart1ClickSeries(Sender: TCustomChart;
Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
Shift: TShiftState; const X, Y: Integer);
begin
ShowMessage(Format(&#039;点击了序列 %s 的第 %d 个点&#039;,
[Series.Title, ValueIndex]));
end;
// 鼠标移动
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
// 实时显示坐标
end;</code></pre>
<p>这些是 TChart 的主要属性和用法。TChart 功能非常丰富,可以根据具体需求进行更深入的定制和扩展。</p>