2013-06-05 1 views
4

Je peux créer un diagramme à barres empilées dans Delphi en utilisant TeeChart. Ceci utilise des valeurs et des séries ajoutées dans une boucle. Je préférerais créer ce graphique en utilisant simplement une requête comme source de données et ne pas avoir à ajouter chaque barre comme une série séparée dans une boucle. Y a-t-il une meilleure façon de le faire, ou un autre type de graphique que je devrais regarder? Les données sont une coupe transversale de types de roches provenant d'un échantillon de carotte. L'ensemble de données contient un enregistrement pour chaque mesure de profondeur et de type de roche. Il est affiché comme une seule colonne verticale de types de roche, tout comme un échantillon de carotte.comment faire un barchart empilé à partir d'un jeu de données en utilisant techart dans 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; 

Répondre

2

Essayez d'utiliser mbSelfStackMultiBar style pour votre TBarSeries. Ici, il est un exemple:

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; 

Avec ce style, sont empilées les valeurs dans un seul TBarSeries un sur l'autre

+0

merci fantastique. Cela fonctionne bien. Maintenant, j'ai d'autres problèmes à résoudre avec la légende - dois-je créer une nouvelle question? – user2455609

+0

Bien sûr! Nouvelle question, nouveau fil – Yeray

Questions connexes