【问题标题】:how to do a stacked barchart from a dataset using teechart in delphi如何在delphi中使用teechart从数据集中制作堆叠条形图
【发布时间】:2013-06-01 05:04:14
【问题描述】:

我可以使用 TeeChart 在 Delphi 中创建堆叠条形图。这是使用循环中添加的值和系列。我宁愿通过仅使用查询作为数据源来创建此图表,而不必将每个条添加为循环内的单独系列。有没有更好的方法来做到这一点,或者我应该看另一种类型的图表?数据是来自井芯样本的岩石类型的横截面。该数据集包含每个深度和岩石类型测量的记录。它显示为单个垂直的岩石类型柱,就像岩心样本一样。

+----+
|    | record 1 - depth1, rock type 1
|    |
+----+
|    |
|    |
|    | record 2 - depth2, rock type 2
|    |
+----+
|    | record 3 - depth3, rock type 3
+----+


procedure TForm128.GenerateLithologyChart;
var
  LSeries: TBarSeries;
  i : integer;
  LastBot : double;

  procedure AddRockSeries(depth : double; col : TColor);
  begin
    LSeries := TBarSeries.Create(LithologyChart);
    LithologyChart.AddSeries(LSeries);
    LSeries.AddBar(0, '', clBlue);
    if col=clNone then
      LSeries.AddNullXY(0,depth,'')
    else
      LSeries.AddXY(0,depth,'',col);
    LSeries.Marks.Visible := False;
    LSeries.MultiBar := mbStacked;
    LSeries.CustomBarWidth := 80;
  end;

begin
  LithologyChart.LeftAxis.Inverted := True;
  LithologyChart.Title.Text.Text := 'Well Lithology - data-aware test';
  LithologyChart.SeriesList.Clear;
  AdoQuery1.First;
  i := 0;
  LastBot := 0;
  while not AdoQuery1.Eof do begin
    if abs(AdoQuery1.FieldByName('Strata Top').asFloat-LastBot) > 0.0005 then begin
      // create blank cross section for the missing depth range
      AddRockSeries(AdoQuery1.FieldByName('Strata Top').asFloat-LastBot, clNone);
    end;
    AddRockSeries(AdoQuery1.FieldByName('Strata Bottom').asFloat-AdoQuery1.FieldByName('Strata Top').asFloat, clRed);

    LastBot := AdoQuery1.FieldByName('Strata Bottom').asFloat;
    inc(i);
    //if i = 3 then break;

    AdoQuery1.Next;
  end;
  AdoQuery1.First;
end;

【问题讨论】:

    标签: delphi bar-chart delphi-2007 teechart stackedbarseries


    【解决方案1】:

    尝试为您的TBarSeries 使用mbSelfStack MultiBar 样式。这是一个例子:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Chart1.View3D:=false;
      with Chart1.AddSeries(TBarSeries) as TBarSeries do
      begin
        Marks.Visible:=false;
        MultiBar:=mbSelfStack;
        FillSampleValues;
      end;
    end;
    

    使用这种样式,单个 TBarSeries 中的值将堆叠在另一个之上

    【讨论】:

    • 非常感谢。这很好用。现在我还有一些关于图例的问题要解决 - 我应该创建一个新问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2022-11-23
    • 2016-01-29
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多