Die TFuncSeries ist gedacht, mathematische Funktionen zu zeichen, im OnCalculate-Event-Handler gibt man an, wie sich y (AY) aus x (AX) berechnet. Für ein etwas komplexeres Beispiel kannst du dir dieses Tutorial anschauen:
http://wiki.lazarus.freepascal.org/TACh ... ion_Series. Weil die FuncSeries für jeden beliebigen Punkt berechnet wird, kann man reinzoomen, ohne dass Stufen sichtbar werden (was bei einer TLineSeries geschehen würde, bei der die Funktion für diskrete Werte ausgerechnet wird).
Zu deinem Problem: Du wendest die Mean-Function nur auf den einen Wert AX an - der Mittelwert eines Datenpunktes ist aber der Wert selber. Daher erhältst du für jeden x-wert als y-Wert den x-Wert, d.h. die y-Werte sind gleich den x-Werten. Wenn die y-Werte im Array yData[0..n-1] stehen, dann müsstest du stattdessen Mean mit dem Argument yData aufrufen:
Code: Alles auswählen
procedure TMainForm.MyFunc(const AX: Double; out AY: Double);
begin
AY := Mean(yData);
end;
Das wäre aber ungeschickt, da der Mittelwert für jeden x-Wert neu berechnet wird, obwohl er sich ja gar nicht ändert.
Für einen einfachen Mittelwert ist das Overkill. Nimm doch stattdessen die TConstantLine Series.
In deinem Code fehlt noch, wie sumavg berechnet wird - du musst einfach alle Datenpunkte durchlaufen und die y-Werte addieren. Falls, wie oben schon erwähnt, alle y-Werte in einem Array stehen, kannst du auch die Mean-Funktion aus der Unit math verwenden; wenn nicht, ist diese Funktion nutzlos.
Noch ein Hinweis: Wenn sich etwas an deinen Daten ändert, musst du bei der ConstantLine Series den Mittelwert neu berechnen und im Feld Position der Series entsprechend neu eintragen. Bei einer TCalculatedChartSource ist das nicht nötig, denn diese bekommt mit, wenn Daten sich ändern.
[EDIT]
Übrigens, falls du die Balkengruppen an jeder Achsenmarkierung zentriert haben willst: Die Breite jedes Balkens ist bestimmt durch BarWidthPercent (bezogen auf den Abstand der Mittelpunkte der Balkengruppen). Die Mitte jedes Balkens liegt bei BarOffsetPercent. Bei zwei Balken pro Gruppe muss BarWidthPercent kleiner sein als 50%, denn 2x50%=100% --> die Balkengruppen stoßen zusammen. Um etwas Abstand zwischen den Balkengruppen zu lassen, nimm z.B. BarWidthPercent = 40%. Um die Hälfte dieser Zahl musst du die 1.Balkengruppe nach links (BarOffsetPercen = 20) und die 2. Balkengruppe nach rechts (BarOffsetPercent = +20) verschieben, so dass der Schwerpunkt der Balkengruppe bei der Achsenmarkierung liegt.
Noch ein Hinweis: Falls du den grauen Hintergrund des Titels nicht willst, kannst du auch Chart.Title.Brush.Style = fsClear verwenden (--> Transparenter Hintergrund)