我可以使用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,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;
解决方法
尝试为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中的值将堆叠在一起