You've already forked lazarus-ccr
LazStats: Use TAChart in MultXvsYUnit. Some cosmetics.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7630 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -1424,11 +1424,6 @@
|
|||||||
<DebugInfoType Value="dsDwarf2"/>
|
<DebugInfoType Value="dsDwarf2"/>
|
||||||
</Debugging>
|
</Debugging>
|
||||||
<LinkSmart Value="True"/>
|
<LinkSmart Value="True"/>
|
||||||
<Options>
|
|
||||||
<Win32>
|
|
||||||
<GraphicApplication Value="True"/>
|
|
||||||
</Win32>
|
|
||||||
</Options>
|
|
||||||
</Linking>
|
</Linking>
|
||||||
</CompilerOptions>
|
</CompilerOptions>
|
||||||
<Debugging>
|
<Debugging>
|
||||||
|
@@ -8,7 +8,7 @@ uses
|
|||||||
{$ENDIF}{$ENDIF}
|
{$ENDIF}{$ENDIF}
|
||||||
Interfaces, // this includes the LCL widgetset
|
Interfaces, // this includes the LCL widgetset
|
||||||
Forms, tachartlazaruspkg, tachartprint, lhelpcontrolpkg,
|
Forms, tachartlazaruspkg, tachartprint, lhelpcontrolpkg,
|
||||||
Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit, utils, chartunit;
|
Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit; //, utils, chartunit;
|
||||||
|
|
||||||
{$R LazStats.res}
|
{$R LazStats.res}
|
||||||
|
|
||||||
@@ -26,8 +26,9 @@ begin
|
|||||||
else
|
else
|
||||||
Application.Terminate;
|
Application.Terminate;
|
||||||
end;
|
end;
|
||||||
Application.CreateForm(TMainDataModule, MainDataModule);
|
|
||||||
Application.CreateForm(TOS3MainFrm, OS3MainFrm);
|
Application.CreateForm(TMainDataModule, MainDataModule);
|
||||||
|
Application.CreateForm(TOS3MainFrm, OS3MainFrm);
|
||||||
Application.Run;
|
Application.Run;
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@@ -3,11 +3,12 @@
|
|||||||
unit MultXvsYUnit;
|
unit MultXvsYUnit;
|
||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
{$i ../../../LazStats.inc}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
|
||||||
StdCtrls, ExtCtrls, Buttons, Clipbrd,
|
StdCtrls, ExtCtrls, Buttons, Clipbrd,
|
||||||
MainUnit, Globals, OutputUnit, DataProcs, DictionaryUnit, ContextHelpUnit;
|
MainUnit, Globals, OutputUnit, DataProcs, DictionaryUnit, ContextHelpUnit;
|
||||||
|
|
||||||
@@ -52,7 +53,7 @@ type
|
|||||||
procedure GroupOutBtnClick(Sender: TObject);
|
procedure GroupOutBtnClick(Sender: TObject);
|
||||||
procedure HelpBtnClick(Sender: TObject);
|
procedure HelpBtnClick(Sender: TObject);
|
||||||
procedure ResetBtnClick(Sender: TObject);
|
procedure ResetBtnClick(Sender: TObject);
|
||||||
procedure VarListSelectionChange(Sender: TObject; User: boolean);
|
procedure VarListSelectionChange(Sender: TObject; {%H-}User: boolean);
|
||||||
procedure XInBtnClick(Sender: TObject);
|
procedure XInBtnClick(Sender: TObject);
|
||||||
procedure XOutBtnClick(Sender: TObject);
|
procedure XOutBtnClick(Sender: TObject);
|
||||||
procedure YInBtnClick(Sender: TObject);
|
procedure YInBtnClick(Sender: TObject);
|
||||||
@@ -60,8 +61,12 @@ type
|
|||||||
private
|
private
|
||||||
{ private declarations }
|
{ private declarations }
|
||||||
FAutoSized: Boolean;
|
FAutoSized: Boolean;
|
||||||
procedure PlotXY(var XValues: DblDyneMat; YValues: DblDyneMat;
|
{$IFDEF USE_TACHART}
|
||||||
|
procedure PlotXY(const XValues, YValues: DblDyneMat; MinGrp: Integer);
|
||||||
|
{$ELSE}
|
||||||
|
procedure PlotXY(const XValues, YValues: DblDyneMat;
|
||||||
MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer);
|
MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer);
|
||||||
|
{$ENDIF}
|
||||||
procedure UpdateBtnStates;
|
procedure UpdateBtnStates;
|
||||||
|
|
||||||
public
|
public
|
||||||
@@ -73,14 +78,23 @@ var
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
{$R *.lfm}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Math,
|
{$IFDEF USE_TACHART}
|
||||||
BlankFrmUnit;
|
TATypes,
|
||||||
|
ChartUnit,
|
||||||
|
{$ELSE}
|
||||||
|
BlankFrmUnit,
|
||||||
|
{$ENDIF}
|
||||||
|
Math, Utils;
|
||||||
|
|
||||||
|
|
||||||
{ TMultXvsYFrm }
|
{ TMultXvsYFrm }
|
||||||
|
|
||||||
procedure TMultXvsYFrm.ResetBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.ResetBtnClick(Sender: TObject);
|
||||||
VAR i : integer;
|
var
|
||||||
|
i : integer;
|
||||||
begin
|
begin
|
||||||
VarList.Clear;
|
VarList.Clear;
|
||||||
for i := 1 to NoVariables do
|
for i := 1 to NoVariables do
|
||||||
@@ -90,19 +104,16 @@ begin
|
|||||||
GroupEdit.Text := '';
|
GroupEdit.Text := '';
|
||||||
DescChk.Checked := false;
|
DescChk.Checked := false;
|
||||||
LinesChk.Checked := false;
|
LinesChk.Checked := false;
|
||||||
XInBtn.Enabled := true;
|
UpdateBtnStates;
|
||||||
YInBtn.Enabled := true;
|
|
||||||
GroupInBtn.Enabled := true;
|
|
||||||
XOutBtn.Enabled := false;
|
|
||||||
YOutBtn.Enabled := false;
|
|
||||||
GroupOutBtn.Enabled := false;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.VarListSelectionChange(Sender: TObject; User: boolean);
|
procedure TMultXvsYFrm.VarListSelectionChange(Sender: TObject; User: boolean);
|
||||||
begin
|
begin
|
||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.GroupInBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.GroupInBtnClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
@@ -116,31 +127,32 @@ begin
|
|||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.ComputeBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.ComputeBtnClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
i, j, k, N, NoGrps, XCol, YCol, GrpCol, Grp, MinGrp, MaxGrp: integer;
|
|
||||||
NoSelected, MaxGrpSize: integer;
|
|
||||||
selected, NoInGrp: IntDyneVec;
|
|
||||||
YValues, XValues: DblDyneMat;
|
|
||||||
Means, StdDevs: DblDyneVec;
|
|
||||||
MinX, MaxX, MinY, MaxY, X, Y, temp: double;
|
|
||||||
cellstring: string;
|
|
||||||
lReport: TStrings;
|
lReport: TStrings;
|
||||||
|
i, N, NoGrps, XCol, YCol, GrpCol, Grp, MinGrp, MaxGrp: integer;
|
||||||
|
MinX, MaxX, MinY, MaxY, X, Y: double;
|
||||||
|
cellstring: string;
|
||||||
|
MaxGrpSize: integer;
|
||||||
|
NoInGrp: IntDyneVec = nil;
|
||||||
|
XValues: DblDyneMat = nil;
|
||||||
|
YValues: DblDyneMat = nil;
|
||||||
|
Means: array[0..1] of Double = (0.0, 0.0);
|
||||||
|
StdDevs: array[0..1] of Double = (0.0, 0.0);
|
||||||
|
selected: array[0..2] of Integer = (0, 0, 0);
|
||||||
|
NoSelected: Integer = 3;
|
||||||
begin
|
begin
|
||||||
MaxGrpSize := 0;
|
MaxGrpSize := 0;
|
||||||
SetLength(selected, 3);
|
MaxX := -Infinity;
|
||||||
MaxX := -1.0e308;
|
MinX := Infinity;
|
||||||
MinX := 1.0e308;
|
MaxY := -Infinity;
|
||||||
MaxY := -1.0e308;
|
MinY := Infinity;
|
||||||
MinY := 1.0e308;
|
|
||||||
MinGrp := MaxInt;
|
// Get selected variables
|
||||||
MaxGrp := -MaxInt;
|
|
||||||
XCol := 0;
|
XCol := 0;
|
||||||
YCol := 0;
|
YCol := 0;
|
||||||
GrpCol := 0;
|
GrpCol := 0;
|
||||||
N := 0;
|
|
||||||
|
|
||||||
// Get selected variables
|
|
||||||
for i := 1 to NoVariables do
|
for i := 1 to NoVariables do
|
||||||
begin
|
begin
|
||||||
cellstring := OS3MainFrm.DataGrid.Cells[i,0];
|
cellstring := OS3MainFrm.DataGrid.Cells[i,0];
|
||||||
@@ -148,68 +160,64 @@ begin
|
|||||||
if (cellstring = YEdit.Text) then selected[1] := i;
|
if (cellstring = YEdit.Text) then selected[1] := i;
|
||||||
if (cellstring = GroupEdit.Text) then selected[2] := i;
|
if (cellstring = GroupEdit.Text) then selected[2] := i;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
XCol := selected[0];
|
XCol := selected[0];
|
||||||
YCol := selected[1];
|
YCol := selected[1];
|
||||||
GrpCol := selected[2];
|
GrpCol := selected[2];
|
||||||
NoSelected := 3;
|
|
||||||
|
|
||||||
if (XCol = 0) or (YCol = 0) or (GrpCol = 0) then
|
if (XCol = 0) or (YCol = 0) or (GrpCol = 0) then
|
||||||
begin
|
begin
|
||||||
MessageDlg('No variable selected.', mtError, [mbOK], 0);
|
ErrorMsg('No variable selected.');
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// Get number of groups
|
// Get number of groups
|
||||||
|
MinGrp := MaxInt;
|
||||||
|
MaxGrp := -MaxInt;
|
||||||
for i := 1 to NoCases do
|
for i := 1 to NoCases do
|
||||||
begin
|
begin
|
||||||
Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol,i]);
|
Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol, i]);
|
||||||
if (Grp > MaxGrp) then MaxGrp := Grp;
|
MaxGrp := Max(MaxGrp, Grp);
|
||||||
if (Grp < MinGrp) then MinGrp := Grp;
|
MinGrp := Min(MinGrp, Grp);
|
||||||
end;
|
end;
|
||||||
NoGrps := (MaxGrp - MinGrp) + 1;
|
NoGrps := (MaxGrp - MinGrp) + 1;
|
||||||
|
|
||||||
lReport := TStringList.Create;
|
SetLength(XValues, NoGrps, NoCases); // NoCases is over-dimensioned and will be trimmed later.
|
||||||
try
|
SetLength(YValues, NoGrps, NoCases); // dto.
|
||||||
lReport.Add('X VERSUS Y FOR GROUPS PLOT');
|
|
||||||
lReport.Add('');
|
|
||||||
|
|
||||||
SetLength(YValues, NoCases+1, NoGrps+1);
|
|
||||||
SetLength(XValues, NoCases+1, NoGrps+1);
|
|
||||||
SetLength(Means, 2);
|
|
||||||
SetLength(StdDevs, 2);
|
|
||||||
SetLength(NoInGrp, NoGrps);
|
SetLength(NoInGrp, NoGrps);
|
||||||
|
for i := 0 to NoGrps - 1 do NoInGrp[i] := 0;
|
||||||
|
|
||||||
for i := 0 to 1 do
|
N := 0;
|
||||||
begin
|
|
||||||
Means[i] := 0.0;
|
|
||||||
StdDevs[i] := 0.0;
|
|
||||||
end;
|
|
||||||
for i := 0 to NoGrps - 1 do
|
|
||||||
NoInGrp[i] := 0;
|
|
||||||
|
|
||||||
for i := 1 to NoCases do
|
for i := 1 to NoCases do
|
||||||
begin
|
begin
|
||||||
if (not GoodRecord(i,NoSelected,selected))then continue;
|
if (not GoodRecord(i, NoSelected, selected))then continue;
|
||||||
inc(N);
|
inc(N);
|
||||||
X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]);
|
|
||||||
if (X > MaxX) then MaxX := X;
|
|
||||||
if (X < MinX) then MinX := X;
|
|
||||||
|
|
||||||
Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]);
|
X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol, i]);
|
||||||
if (Y > MaxY) then MaxY := Y;
|
MaxX := Max(MaxX, X);
|
||||||
if (Y < MinY) then MinY := Y;
|
MinX := Min(MinX, X);
|
||||||
|
|
||||||
Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol,i]);
|
Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol, i]);
|
||||||
Grp := Grp - MinGrp;
|
MaxY := Max(MaxY, Y);
|
||||||
NoInGrp[Grp] := NoInGrp[Grp] + 1;
|
MinY := Min(MinY, Y);
|
||||||
if (NoInGrp[Grp] > MaxGrpSize) then MaxGrpSize := NoInGrp[Grp];
|
|
||||||
YValues[NoInGrp[Grp]-1,Grp] := Y;
|
Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol, i]) - MinGrp;
|
||||||
XValues[NoInGrp[Grp]-1,Grp] := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]);
|
XValues[Grp, NoInGrp[Grp]] := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol, i]);
|
||||||
|
YValues[Grp, NoInGrp[Grp]] := Y;
|
||||||
|
inc(NoInGrp[Grp]);
|
||||||
|
MaxGrpSize := Max(MaxGrpsize, NoInGrp[Grp]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Trim XValues and YValues to correct dimension.
|
||||||
|
SetLength(XValues, NoGrps);
|
||||||
|
SetLength(YValues, NoGrps);
|
||||||
|
for grp := 0 to NoGrps-1 do
|
||||||
|
begin
|
||||||
|
SetLength(XValues[grp], NoInGrp[grp]);
|
||||||
|
SetLength(YValues[grp], NoInGrp[grp]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// get descriptive data
|
// get descriptive data
|
||||||
if (DescChk.Checked) then
|
if DescChk.Checked then
|
||||||
begin
|
begin
|
||||||
for i := 1 to NoCases do
|
for i := 1 to NoCases do
|
||||||
begin
|
begin
|
||||||
@@ -217,60 +225,50 @@ begin
|
|||||||
Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]);
|
Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]);
|
||||||
X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]);
|
X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]);
|
||||||
Means[0] := Means[0] + X;
|
Means[0] := Means[0] + X;
|
||||||
StdDevs[0] := StdDevs[0] + X * X;
|
StdDevs[0] := StdDevs[0] + sqr(X);
|
||||||
Means[1] := Means[1] + Y;
|
Means[1] := Means[1] + Y;
|
||||||
StdDevs[1] := StdDevs[1] + Y * Y;
|
StdDevs[1] := StdDevs[1] + sqr(Y);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
for i := 0 to 1 do
|
for i := 0 to 1 do
|
||||||
begin
|
begin
|
||||||
StdDevs[i] := StdDevs[i] - (Means[i] * Means[i]) / N;
|
StdDevs[i] := StdDevs[i] - sqr(Means[i]) / N;
|
||||||
StdDevs[i] := sqrt(StdDevs[i] / (N - 1));
|
StdDevs[i] := sqrt(StdDevs[i] / (N - 1));
|
||||||
Means[i] := Means[i] / N;
|
Means[i] := Means[i] / N;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
lReport := TStringList.Create;
|
||||||
|
try
|
||||||
|
lReport.Add('X VERSUS Y FOR GROUPS PLOT');
|
||||||
|
lReport.Add('');
|
||||||
|
lReport.Add('X variable: ' + XEdit.Text);
|
||||||
|
lReport.Add('Y variable: ' + YEdit.Text);
|
||||||
|
lReport.Add('');
|
||||||
|
|
||||||
lReport.Add('VARIABLE MEAN STANDARD DEVIATION');
|
lReport.Add('VARIABLE MEAN STANDARD DEVIATION');
|
||||||
lReport.Add(' X %9.3f %14.3f', [Means[0], StdDevs[0]]);
|
lReport.Add(' X %9.3f %14.3f', [Means[0], StdDevs[0]]);
|
||||||
lReport.Add(' Y %9.3f %14.3f', [Means[1], StdDevs[1]]);
|
lReport.Add(' Y %9.3f %14.3f', [Means[1], StdDevs[1]]);
|
||||||
lReport.Add('');
|
lReport.Add('');
|
||||||
|
|
||||||
DisplayReport(lReport);
|
DisplayReport(lReport);
|
||||||
|
finally
|
||||||
|
lReport.Free;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// sort on X
|
// sort on X
|
||||||
for i := 0 to NoGrps - 1 do
|
for i := 0 to NoGrps - 1 do
|
||||||
begin
|
SortOnX(XValues[i], YValues[i]);
|
||||||
for j := 0 to MaxGrpSize-2 do
|
|
||||||
begin
|
|
||||||
for k := j+1 to MaxGrpSize - 1 do
|
|
||||||
begin
|
|
||||||
if (XValues[j,i] > XValues[k,i]) then // swap
|
|
||||||
begin
|
|
||||||
temp := XValues[j,i];
|
|
||||||
XValues[j,i] := XValues[k,i];
|
|
||||||
XValues[k,i] := temp;
|
|
||||||
temp := YValues[j,i];
|
|
||||||
YValues[j,i] := YValues[k,i];
|
|
||||||
YValues[k,i] := temp;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
BlankFrm.Image1.Canvas.Clear;
|
// Plot data
|
||||||
BlankFrm.Show;
|
PlotXY(XValues, YValues{$IFNDEF USE_TACHART}, MaxX, MinX, MaxY, MinY, MaxGrpSize, NoGrps{$ENDIF}, MinGrp);
|
||||||
PlotXY(XValues, YValues, MaxX, MinX, MaxY, MinY, MaxGrpSize, NoGrps, MinGrp);
|
|
||||||
|
|
||||||
finally
|
|
||||||
lReport.Free;
|
|
||||||
NoInGrp := nil;
|
NoInGrp := nil;
|
||||||
StdDevs := nil;
|
|
||||||
Means := nil;
|
|
||||||
XValues := nil;
|
XValues := nil;
|
||||||
YValues := nil;
|
YValues := nil;
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.FormActivate(Sender: TObject);
|
procedure TMultXvsYFrm.FormActivate(Sender: TObject);
|
||||||
var
|
var
|
||||||
w: Integer;
|
w: Integer;
|
||||||
@@ -290,18 +288,20 @@ begin
|
|||||||
FAutoSized := true;
|
FAutoSized := true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.FormCreate(Sender: TObject);
|
procedure TMultXvsYFrm.FormCreate(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
Assert(OS3MainFrm <> nil);
|
Assert(OS3MainFrm <> nil);
|
||||||
if DictionaryFrm = nil then Application.CreateForm(TDictionaryFrm, DictionaryFrm);
|
if DictionaryFrm = nil then Application.CreateForm(TDictionaryFrm, DictionaryFrm);
|
||||||
if BlankFrm = nil then Application.CreateForm(TBlankFrm, BlankFrm);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.FormShow(Sender: TObject);
|
procedure TMultXvsYFrm.FormShow(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
ResetBtnClick(self);
|
ResetBtnClick(self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.GroupOutBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.GroupOutBtnClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if GroupEdit.Text <> '' then
|
if GroupEdit.Text <> '' then
|
||||||
@@ -312,6 +312,7 @@ begin
|
|||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.HelpBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.HelpBtnClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if ContextHelpForm = nil then
|
if ContextHelpForm = nil then
|
||||||
@@ -319,6 +320,7 @@ begin
|
|||||||
ContextHelpForm.HelpMessage((Sender as TButton).Tag);
|
ContextHelpForm.HelpMessage((Sender as TButton).Tag);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.XInBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.XInBtnClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
@@ -332,6 +334,7 @@ begin
|
|||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.XOutBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.XOutBtnClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if XEdit.Text <> '' then
|
if XEdit.Text <> '' then
|
||||||
@@ -342,6 +345,7 @@ begin
|
|||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.YInBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.YInBtnClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
@@ -355,6 +359,7 @@ begin
|
|||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.YOutBtnClick(Sender: TObject);
|
procedure TMultXvsYFrm.YOutBtnClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if YEdit.Text <> '' then
|
if YEdit.Text <> '' then
|
||||||
@@ -365,8 +370,48 @@ begin
|
|||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// routine to plot X versus multiple Y values
|
|
||||||
procedure TMultXvsYFrm.plotxy(var XValues: DblDyneMat; YValues: DblDyneMat;
|
// Routine to plot X versus multiple Y values for several groups
|
||||||
|
// 1st index: group index, 2nd index: point index within group
|
||||||
|
{$IFDEF USE_TACHART}
|
||||||
|
procedure TMultXvsYFrm.PlotXY(const XValues, YValues: DblDyneMat; MinGrp: Integer);
|
||||||
|
var
|
||||||
|
pt: TPlotType;
|
||||||
|
grp: Integer;
|
||||||
|
clr: TColor;
|
||||||
|
grpName: String;
|
||||||
|
sym: TSeriesPointerStyle;
|
||||||
|
begin
|
||||||
|
if Length(XValues) <> Length(YValues) then
|
||||||
|
begin
|
||||||
|
ErrorMsg('Incorrect dimension of XValues and YValues');
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if ChartForm = nil then
|
||||||
|
ChartForm := TChartForm.Create(Application)
|
||||||
|
else
|
||||||
|
ChartForm.Clear;
|
||||||
|
|
||||||
|
// Titles
|
||||||
|
ChartForm.SetTitle(LabelEdit.Text);
|
||||||
|
ChartForm.SetXTitle(XEdit.Text);
|
||||||
|
chartForm.SetYTitle(YEdit.Text);
|
||||||
|
|
||||||
|
if LinesChk.Checked then pt := ptLinesAndSymbols else pt := ptSymbols;
|
||||||
|
|
||||||
|
for grp := 0 to Length(XValues)-1 do
|
||||||
|
begin
|
||||||
|
clr := DATA_COLORS[grp mod Length(DATA_COLORS)];
|
||||||
|
sym := DATA_SYMBOLS[grp mod Length(DATA_SYMBOLS)];
|
||||||
|
grpName := Format('%s = %d', [GroupEdit.Text, grp + MinGrp]);
|
||||||
|
ChartForm.PlotXY(pt, XValues[grp], YValues[grp], grpName, clr, sym);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ChartForm.Show;
|
||||||
|
end;
|
||||||
|
{$ELSE}
|
||||||
|
procedure TMultXvsYFrm.PlotXY(const XValues, YValues: DblDyneMat;
|
||||||
MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer);
|
MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer);
|
||||||
var
|
var
|
||||||
xpos, ypos, hleft, hright, vtop, vbottom, imagewide : integer;
|
xpos, ypos, hleft, hright, vtop, vbottom, imagewide : integer;
|
||||||
@@ -374,6 +419,12 @@ var
|
|||||||
valincr, Yvalue, Xvalue, value : double;
|
valincr, Yvalue, Xvalue, value : double;
|
||||||
Title: string;
|
Title: string;
|
||||||
begin
|
begin
|
||||||
|
if BlankFrm = nil then
|
||||||
|
Application.CreateForm(TBlankFrm, BlankFrm)
|
||||||
|
else
|
||||||
|
BlankFrm.Image1.Canvas.Clear;
|
||||||
|
BlankFrm.Show;
|
||||||
|
|
||||||
Title := LabelEdit.Text;
|
Title := LabelEdit.Text;
|
||||||
BlankFrm.Caption := Title;
|
BlankFrm.Caption := Title;
|
||||||
BlankFrm.Show;
|
BlankFrm.Show;
|
||||||
@@ -460,6 +511,17 @@ begin
|
|||||||
BlankFrm.Image1.Canvas.Font.Color := DATA_COLORS[j mod Length(DATA_COLORS)];
|
BlankFrm.Image1.Canvas.Font.Color := DATA_COLORS[j mod Length(DATA_COLORS)];
|
||||||
Grp := MinGrp + j;
|
Grp := MinGrp + j;
|
||||||
Title := 'GROUP ' + IntToStr(Grp);
|
Title := 'GROUP ' + IntToStr(Grp);
|
||||||
|
for i := 0 to N - 1 do
|
||||||
|
begin
|
||||||
|
xpos := hleft + ceil(hwide * ( (XValues[j, i] - MinX) / (MaxX - MinX)));
|
||||||
|
ypos := vtop + ceil(vhi * ( (MaxY - YValues[j, i]) / (MaxY - MinY)));
|
||||||
|
if (i = 0) then
|
||||||
|
BlankFrm.Image1.Canvas.MoveTo(xpos, ypos);
|
||||||
|
if LinesChk.Checked then
|
||||||
|
BlankFrm.Image1.Canvas.LineTo(xpos, ypos);
|
||||||
|
BlankFrm.Image1.Canvas.Ellipse(xpos, ypos, xpos+5, ypos+5);
|
||||||
|
end;
|
||||||
|
(*
|
||||||
for i := 1 to N do
|
for i := 1 to N do
|
||||||
begin
|
begin
|
||||||
ypos := vtop + ceil(vhi * ( (MaxY - YValues[i-1,j]) / (MaxY - MinY)));
|
ypos := vtop + ceil(vhi * ( (MaxY - YValues[i-1,j]) / (MaxY - MinY)));
|
||||||
@@ -470,6 +532,7 @@ begin
|
|||||||
BlankFrm.Image1.Canvas.LineTo(xpos, ypos);
|
BlankFrm.Image1.Canvas.LineTo(xpos, ypos);
|
||||||
BlankFrm.Image1.Canvas.Ellipse(xpos, ypos, xpos+5, ypos+5);
|
BlankFrm.Image1.Canvas.Ellipse(xpos, ypos, xpos+5, ypos+5);
|
||||||
end;
|
end;
|
||||||
|
*)
|
||||||
strhi := BlankFrm.Image1.Canvas.TextHeight(Title);
|
strhi := BlankFrm.Image1.Canvas.TextHeight(Title);
|
||||||
BlankFrm.Image1.Canvas.Brush.Color := clWhite;
|
BlankFrm.Image1.Canvas.Brush.Color := clWhite;
|
||||||
BlankFrm.Image1.Canvas.Pen.Color := clBlack;
|
BlankFrm.Image1.Canvas.Pen.Color := clBlack;
|
||||||
@@ -480,6 +543,8 @@ begin
|
|||||||
|
|
||||||
BlankFrm.Image1.Canvas.Font.Color := clBlack;
|
BlankFrm.Image1.Canvas.Font.Color := clBlack;
|
||||||
end;
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
procedure TMultXvsYFrm.UpdateBtnStates;
|
procedure TMultXvsYFrm.UpdateBtnStates;
|
||||||
var
|
var
|
||||||
@@ -502,8 +567,6 @@ begin
|
|||||||
GroupOutBtn.Enabled := (GroupEdit.Text <> '');
|
GroupOutBtn.Enabled := (GroupEdit.Text <> '');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
|
||||||
{$I multxvsyunit.lrs}
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@@ -75,6 +75,7 @@ object ChartForm: TChartForm
|
|||||||
Caption = 'Close'
|
Caption = 'Close'
|
||||||
Default = True
|
Default = True
|
||||||
ModalResult = 11
|
ModalResult = 11
|
||||||
|
OnClick = CloseBtnClick
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@@ -6,7 +6,8 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
|
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
|
||||||
StdCtrls, ExtDlgs, TAGraph, TACustomSeries, TASeries, PrintersDlgs,
|
StdCtrls, ExtDlgs, PrintersDlgs,
|
||||||
|
TAGraph, TACustomSeries, TASeries, TATypes,
|
||||||
Globals;
|
Globals;
|
||||||
|
|
||||||
type
|
type
|
||||||
@@ -26,6 +27,7 @@ type
|
|||||||
PrintDialog: TPrintDialog;
|
PrintDialog: TPrintDialog;
|
||||||
SaveBtn: TButton;
|
SaveBtn: TButton;
|
||||||
SavePictureDialog: TSavePictureDialog;
|
SavePictureDialog: TSavePictureDialog;
|
||||||
|
procedure CloseBtnClick(Sender: TObject);
|
||||||
procedure FormActivate(Sender: TObject);
|
procedure FormActivate(Sender: TObject);
|
||||||
procedure FormCreate(Sender: TObject);
|
procedure FormCreate(Sender: TObject);
|
||||||
procedure PrintBtnClick(Sender: TObject);
|
procedure PrintBtnClick(Sender: TObject);
|
||||||
@@ -42,7 +44,7 @@ type
|
|||||||
|
|
||||||
procedure HorLine(y: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String);
|
procedure HorLine(y: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String);
|
||||||
function PlotXY(AType: TPlotType; x, y: DblDyneVec; LegendTitle: string;
|
function PlotXY(AType: TPlotType; x, y: DblDyneVec; LegendTitle: string;
|
||||||
AColor: TColor; xTitles: StrDynevec = nil): TChartSeries;
|
AColor: TColor; ASymbol: TSeriesPointerStyle = psCircle): TChartSeries;
|
||||||
procedure Vertline(x: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String);
|
procedure Vertline(x: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String);
|
||||||
|
|
||||||
procedure SetFooter(const ATitle: String);
|
procedure SetFooter(const ATitle: String);
|
||||||
@@ -61,7 +63,7 @@ implementation
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Math, Printers, OSPrinters,
|
Math, Printers, OSPrinters,
|
||||||
TAChartUtils, TATypes, TADrawerSVG, TAPrint;
|
TAChartUtils, TADrawerSVG, TAPrint;
|
||||||
|
|
||||||
{ TChartForm }
|
{ TChartForm }
|
||||||
|
|
||||||
@@ -84,6 +86,11 @@ begin
|
|||||||
CloseBtn.Constraints.MinWidth := w;
|
CloseBtn.Constraints.MinWidth := w;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TChartForm.CloseBtnClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
Close;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TChartForm.FormCreate(Sender: TObject);
|
procedure TChartForm.FormCreate(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
Clear;
|
Clear;
|
||||||
@@ -169,10 +176,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function TChartForm.PlotXY(AType: TPlotType; x, y: DblDyneVec;
|
function TChartForm.PlotXY(AType: TPlotType; x, y: DblDyneVec;
|
||||||
LegendTitle: string; AColor: TColor; xTitles: StrDynevec = nil): TChartSeries;
|
LegendTitle: string; AColor: TColor; ASymbol: TSeriesPointerStyle = psCircle): TChartSeries;
|
||||||
var
|
var
|
||||||
i, n: Integer;
|
i, n: Integer;
|
||||||
s: String;
|
|
||||||
begin
|
begin
|
||||||
case AType of
|
case AType of
|
||||||
ptLines, ptSymbols, ptLinesAndSymbols:
|
ptLines, ptSymbols, ptLinesAndSymbols:
|
||||||
@@ -184,7 +190,7 @@ begin
|
|||||||
if AType in [ptSymbols, ptLinesAndSymbols] then
|
if AType in [ptSymbols, ptLinesAndSymbols] then
|
||||||
begin
|
begin
|
||||||
TLineSeries(Result).Pointer.Brush.Color := AColor;
|
TLineSeries(Result).Pointer.Brush.Color := AColor;
|
||||||
TLineSeries(Result).Pointer.Style := psCircle;
|
TLineSeries(Result).Pointer.Style := ASymbol;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
ptHorBars, ptVertBars:
|
ptHorBars, ptVertBars:
|
||||||
@@ -197,18 +203,11 @@ begin
|
|||||||
|
|
||||||
n := Min(Length(x), Length(y));
|
n := Min(Length(x), Length(y));
|
||||||
for i := 0 to n-1 do
|
for i := 0 to n-1 do
|
||||||
begin
|
Result.AddXY(x[i], y[i]);
|
||||||
if (xTitles <> nil) and (i <= Length(xTitles)) then
|
|
||||||
s := xTitles[i]
|
|
||||||
else
|
|
||||||
s := '';
|
|
||||||
Result.AddXY(x[i], y[i], s);
|
|
||||||
end;
|
|
||||||
|
|
||||||
Result.Title := LegendTitle;
|
Result.Title := LegendTitle;
|
||||||
Chart.AddSeries(Result);
|
Chart.AddSeries(Result);
|
||||||
Chart.Legend.Visible := Chart.SeriesCount > 0;
|
Chart.Legend.Visible := Chart.SeriesCount > 0;
|
||||||
Chart.Prepare;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TChartForm.SaveBtnClick(Sender: TObject);
|
procedure TChartForm.SaveBtnClick(Sender: TObject);
|
||||||
|
@@ -5,43 +5,30 @@ unit Globals;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, Graphics;
|
Classes, SysUtils, Graphics, TATypes;
|
||||||
|
|
||||||
const TOL = 0.0005;
|
|
||||||
|
|
||||||
Type IntDyneVec = array of integer;
|
|
||||||
|
|
||||||
Type DblDyneVec = array of double;
|
|
||||||
|
|
||||||
Type BoolDyneVec = array of boolean;
|
|
||||||
|
|
||||||
Type DblDyneMat = array of array of double;
|
|
||||||
|
|
||||||
Type IntDyneMat = array of array of integer;
|
|
||||||
|
|
||||||
Type DblDyneCube = array of array of array of double;
|
|
||||||
|
|
||||||
Type IntDyneCube = array of array of array of integer;
|
|
||||||
|
|
||||||
Type DblDyneQuad = array of array of array of array of double;
|
|
||||||
|
|
||||||
Type IntDyneQuad = array of array of array of array of integer;
|
|
||||||
|
|
||||||
Type StrDyneVec = array of string;
|
|
||||||
|
|
||||||
Type StrDyneMat = array of array of string;
|
|
||||||
|
|
||||||
Type CharDyneVec = array of char;
|
|
||||||
|
|
||||||
type POINT3D = record
|
|
||||||
x, y, z : double;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Type POINTint = record
|
|
||||||
x, y : integer;
|
|
||||||
end;
|
|
||||||
|
|
||||||
type
|
type
|
||||||
|
IntDyneVec = array of integer;
|
||||||
|
DblDyneVec = array of double;
|
||||||
|
BoolDyneVec = array of boolean;
|
||||||
|
DblDyneMat = array of array of double;
|
||||||
|
IntDyneMat = array of array of integer;
|
||||||
|
DblDyneCube = array of array of array of double;
|
||||||
|
IntDyneCube = array of array of array of integer;
|
||||||
|
DblDyneQuad = array of array of array of array of double;
|
||||||
|
IntDyneQuad = array of array of array of array of integer;
|
||||||
|
StrDyneVec = array of string;
|
||||||
|
StrDyneMat = array of array of string;
|
||||||
|
CharDyneVec = array of char;
|
||||||
|
|
||||||
|
Point3D = record
|
||||||
|
x, y, z: double;
|
||||||
|
end;
|
||||||
|
|
||||||
|
PointInt = record
|
||||||
|
x, y: Integer;
|
||||||
|
end;
|
||||||
|
|
||||||
TFractionType = (ftPoint, ftComma);
|
TFractionType = (ftPoint, ftComma);
|
||||||
TMissingValueCode = (mvcSpace, mvcPeriod, mvcZero, mvcNines);
|
TMissingValueCode = (mvcSpace, mvcPeriod, mvcZero, mvcNines);
|
||||||
TJustification = (jLeft, jCenter, jRight);
|
TJustification = (jLeft, jCenter, jRight);
|
||||||
@@ -75,12 +62,13 @@ var
|
|||||||
LHelpPath: '<default>';
|
LHelpPath: '<default>';
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
const
|
const
|
||||||
FractionTypeChars: array[TFractionType] of char = ('.', ',');
|
FractionTypeChars: array[TFractionType] of char = ('.', ',');
|
||||||
MissingValueCodes: array[TMissingValueCode] of string = (' ', '.', '0', '99999');
|
MissingValueCodes: array[TMissingValueCode] of string = (' ', '.', '0', '99999');
|
||||||
JustificationCodes: array[TJustification] of string[1] = ('L', 'C', 'R');
|
JustificationCodes: array[TJustification] of string[1] = ('L', 'C', 'R');
|
||||||
|
|
||||||
|
TOL = 0.0005;
|
||||||
|
|
||||||
DEFAULT_CONFIDENCE_LEVEL_PERCENT = 95.0;
|
DEFAULT_CONFIDENCE_LEVEL_PERCENT = 95.0;
|
||||||
DEFAULT_ALPHA_LEVEL = 0.05;
|
DEFAULT_ALPHA_LEVEL = 0.05;
|
||||||
DEFAULT_BETA_LEVEL = 0.20;
|
DEFAULT_BETA_LEVEL = 0.20;
|
||||||
@@ -89,6 +77,9 @@ const
|
|||||||
clMaroon, clRed, clBlue, clGreen, clNavy, clTeal,
|
clMaroon, clRed, clBlue, clGreen, clNavy, clTeal,
|
||||||
clAqua, clLime, clFuchsia, clGray, clSilver, clOlive
|
clAqua, clLime, clFuchsia, clGray, clSilver, clOlive
|
||||||
);
|
);
|
||||||
|
DATA_SYMBOLS: array[0..5] of TSeriesPointerStyle = (psRectangle, psCircle, psDiamond,
|
||||||
|
psDownTriangle, psHexagon, psFullStar);
|
||||||
|
|
||||||
|
|
||||||
DIVIDER = '===========================================================================';
|
DIVIDER = '===========================================================================';
|
||||||
DIVIDER_SMALL = '---------------------------------------------------------------------------';
|
DIVIDER_SMALL = '---------------------------------------------------------------------------';
|
||||||
|
Reference in New Issue
Block a user