LazStats: Use TAChart for plotting in BubblePlotUnit. Update screenshots in help file.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7633 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
b61c350fac
commit
cafec170a8
Binary file not shown.
Binary file not shown.
@ -3,13 +3,14 @@
|
||||
unit BubblePlotUnit;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
{$I ../../../LazStats.inc}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
|
||||
StdCtrls, Clipbrd, Buttons, ExtCtrls, Math,
|
||||
MainUnit, Globals, OutputUnit, DataProcs, DictionaryUnit, ContextHelpUnit;
|
||||
MainUnit, Globals, DataProcs, DictionaryUnit, ContextHelpUnit;
|
||||
|
||||
|
||||
type
|
||||
@ -58,14 +59,18 @@ type
|
||||
procedure ResetBtnClick(Sender: TObject);
|
||||
procedure SizeInBtnClick(Sender: TObject);
|
||||
procedure SizeOutBtnClick(Sender: TObject);
|
||||
procedure VarListSelectionChange(Sender: TObject; User: boolean);
|
||||
procedure VarListSelectionChange(Sender: TObject; {%H-}User: boolean);
|
||||
procedure XInBtnClick(Sender: TObject);
|
||||
procedure XOutBtnClick(Sender: TObject);
|
||||
procedure YInBtnClick(Sender: TObject);
|
||||
procedure YOutBtnClick(Sender: TObject);
|
||||
private
|
||||
{ private declarations }
|
||||
BubbleCol, XCol, YCol, SizeCol: Integer;
|
||||
FAutoSized: boolean;
|
||||
procedure PlotBubbles(
|
||||
{$IFNDEF USE_TACHART}NoReplications: Integer; XMax, XMin: Integer;{$ENDIF}
|
||||
YMax, YMin, BubMax, BubMin: Double);
|
||||
procedure UpdateBtnStates;
|
||||
public
|
||||
{ public declarations }
|
||||
@ -76,58 +81,36 @@ var
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
uses
|
||||
BlankFrmUnit;
|
||||
{$IFDEF USE_TACHART}
|
||||
TAMultiSeries,
|
||||
ChartUnit,
|
||||
{$ELSE}
|
||||
BlankFrmUnit,
|
||||
{$ENDIF}
|
||||
OutputUnit;
|
||||
|
||||
{ TBubbleForm }
|
||||
|
||||
procedure TBubbleForm.IDInBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i := 0;
|
||||
while (BubbleEdit.Text = '') and (i < VarList.Items.Count) do
|
||||
begin
|
||||
if (VarList.Selected[i]) then
|
||||
begin
|
||||
BubbleEdit.Text := VarList.Items[i];
|
||||
VarList.Items.Delete(i);
|
||||
i := 0;
|
||||
end else
|
||||
inc(i);
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.HelpBtnClick(Sender: TObject);
|
||||
begin
|
||||
if ContextHelpForm = nil then
|
||||
Application.CreateForm(TContextHelpForm, ContextHelpForm);
|
||||
ContextHelpForm.HelpMessage((Sender as TButton).Tag);
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.ComputeBtnClick(Sender: TObject);
|
||||
var
|
||||
BubbleCol, XCol, YCol, SizeCol, i, j, LabelWide, TextHi, Xpos: integer;
|
||||
ImageWide, ImageHi, Xstart, Xend, Ystart, Yend, Yincr, cell: integer;
|
||||
Xmin, Xmax, Xrange, Xstep, intcell, noreplications, minrep, maxrep: integer;
|
||||
nobubbles, yprop: integer;
|
||||
varname, Xlabel, Ylabel, astring, Title: string;
|
||||
Ymin, Ymax, Yrange, Ystep, cellvalue, xvalue: double;
|
||||
BubMin, BubMax, BubRange, ratio, value: double;
|
||||
valstr: string;
|
||||
BubColor, place: integer;
|
||||
X1, Y1, X2, Y2: integer;
|
||||
dx, dy: Integer;
|
||||
Data: DblDyneMat;
|
||||
ncases, ncols, BubbleID, newcol : integer;
|
||||
GrandYMean, GrandSizeMean, sizevalue, yvalue: double;
|
||||
Ymeans: DblDyneVec;
|
||||
CaseYMeans: DblDyneVec;
|
||||
SizeMeans: DblDyneVec;
|
||||
CaseSizeMeans: DblDyneVec;
|
||||
i, j, cell: integer;
|
||||
Xmin, Xmax, intcell, noreplications, minrep, maxrep: integer;
|
||||
nobubbles: integer;
|
||||
varname: string;
|
||||
Ymin, Ymax, xvalue, yvalue, sizeValue, cellValue: double;
|
||||
BubMin, BubMax: double;
|
||||
ncases, ncols, BubbleID, newcol: integer;
|
||||
GrandYMean, GrandSizeMean: double;
|
||||
Data: DblDyneMat = nil;
|
||||
Ymeans: DblDyneVec = nil;
|
||||
CaseYMeans: DblDyneVec = nil;
|
||||
SizeMeans: DblDyneVec = nil;
|
||||
CaseSizeMeans: DblDyneVec = nil;
|
||||
outline: string;
|
||||
labels: StrDyneVec;
|
||||
labels: StrDyneVec = nil;
|
||||
lReport: TStrings;
|
||||
begin
|
||||
BubbleCol := 0;
|
||||
@ -176,8 +159,6 @@ begin
|
||||
if (cellvalue > Ymax) then Ymax := cellvalue;
|
||||
if (cellvalue < Ymin) then Ymin := cellvalue;
|
||||
end;
|
||||
Yrange := Ymax - Ymin;
|
||||
Ystep := Yrange / 10;
|
||||
|
||||
// get min, max and range of X
|
||||
Xmin := 10000;
|
||||
@ -188,51 +169,48 @@ begin
|
||||
if (intcell > Xmax) then Xmax := intcell;
|
||||
if (intcell < Xmin) then Xmin := intcell;
|
||||
end;
|
||||
Xrange := Xmax - Xmin;
|
||||
Xstep := Xrange div (noreplications-1);
|
||||
|
||||
// get min, max, range, and increment of bubble sizes
|
||||
BubMin := 1.0e308;
|
||||
BubMax := -1.0e308;
|
||||
BubMin := Infinity;
|
||||
BubMax := -Infinity;
|
||||
for i := 1 to NoCases do
|
||||
begin
|
||||
cellvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[SizeCol,i]);
|
||||
if (cellvalue > BubMax) then BubMax := cellvalue;
|
||||
if (cellvalue < BubMin) then BubMin := cellvalue;
|
||||
end;
|
||||
BubRange := BubMax - BubMin;
|
||||
|
||||
// Display basic statistics
|
||||
ncases := NoCases div noreplications;
|
||||
nCases := NoCases div NoReplications;
|
||||
GrandYMean := 0.0;
|
||||
GrandSizeMean := 0.0;
|
||||
SetLength(CaseYMeans,ncases);
|
||||
SetLength(CaseSizeMeans,ncases);
|
||||
SetLength(Ymeans,noreplications);
|
||||
SetLength(SizeMeans,noreplications);
|
||||
for i := 0 to ncases - 1 do
|
||||
SetLength(CaseYMeans, nCases);
|
||||
SetLength(CaseSizeMeans, nCases);
|
||||
SetLength(YMeans, NoReplications);
|
||||
SetLength(SizeMeans, NoReplications);
|
||||
for i := 0 to nCases - 1 do
|
||||
begin
|
||||
CaseYMeans[i] := 0.0;
|
||||
CaseSizeMeans[i] := 0.0;
|
||||
end;
|
||||
for i := 0 to noreplications - 1 do
|
||||
for i := 0 to NoReplications - 1 do
|
||||
begin
|
||||
Ymeans[i] := 0.0;
|
||||
YMeans[i] := 0.0;
|
||||
SizeMeans[i] := 0.0;
|
||||
end;
|
||||
|
||||
i := 1;
|
||||
while (i <= NoCases) do
|
||||
begin
|
||||
for j := 1 to noreplications do
|
||||
for j := 0 to NoReplications - 1 do
|
||||
begin
|
||||
bubbleID := StrToInt(OS3MainFrm.DataGrid.Cells[BubbleCol,i]);
|
||||
yvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]);
|
||||
sizevalue := StrToFloat(OS3MainFrm.DataGrid.Cells[SizeCol,i]);
|
||||
GrandYMean := GrandYMean + yvalue;
|
||||
GrandSizeMean := GrandSizeMean + sizevalue;
|
||||
Ymeans[j-1] := Ymeans[j-1] + yvalue;
|
||||
SizeMeans[j-1] := SizeMeans[j-1] + sizevalue;
|
||||
Ymeans[j] := Ymeans[j] + yvalue;
|
||||
SizeMeans[j] := SizeMeans[j] + sizevalue;
|
||||
CaseYMeans[bubbleID-1] := CaseYMeans[bubbleID-1] + yvalue;
|
||||
CaseSizeMeans[bubbleID-1] := CaseSizeMeans[bubbleID-1] + sizevalue;
|
||||
inc(i);
|
||||
@ -241,7 +219,7 @@ begin
|
||||
|
||||
GrandYMean := GrandYMean / (ncases * noreplications);
|
||||
GrandSizeMean := GrandSizeMean / (ncases * noreplications);
|
||||
for j := 0 to noreplications - 1 do
|
||||
for j := 0 to NoReplications - 1 do
|
||||
begin
|
||||
Ymeans[j] := Ymeans[j] / ncases;
|
||||
SizeMeans[j] := SizeMeans[j] / ncases;
|
||||
@ -256,26 +234,32 @@ begin
|
||||
try
|
||||
lReport.Add('MEANS FOR Y AND SIZE VARIABLES');
|
||||
lReport.Add('');
|
||||
lReport.Add('Grand Mean for Y := %8.3f', [GrandYMean]);
|
||||
lReport.Add('Grand Mean for Size := %8.3f', [GrandSizeMean]);
|
||||
lReport.Add('Grand Mean for Y: %8.3f', [GrandYMean]);
|
||||
lReport.Add('Grand Mean for Size: %8.3f', [GrandSizeMean]);
|
||||
lReport.Add('');
|
||||
lReport.Add('REPLICATION MEAN Y VALUES (ACROSS OBJECTS)');
|
||||
for j := 0 to noreplications - 1 do
|
||||
lReport.Add('Replication %5d Mean := %8.3f', [j+1, Ymeans[j]]);
|
||||
for j := 0 to NoReplications - 1 do
|
||||
lReport.Add('Replication %5d Mean: %8.3f', [j+1, Ymeans[j]]);
|
||||
lReport.Add('');
|
||||
lReport.Add('REPLICATION MEAN SIZE VALUES (ACROSS OBJECTS)');
|
||||
for j := 0 to noreplications - 1 do
|
||||
lReport.Add('Replication %5d Mean := %8.3f', [j+1, SizeMeans[j]]);
|
||||
for j := 0 to NoReplications - 1 do
|
||||
lReport.Add('Replication %5d Mean: %8.3f', [j+1, SizeMeans[j]]);
|
||||
lReport.Add('');
|
||||
lReport.Add('MEAN Y VALUES FOR EACH BUBBLE (OBJECT)');
|
||||
for i := 0 to ncases - 1 do
|
||||
lReport.Add('Object %5d Mean := %8.3f', [i+1, CaseYMeans[i]]);
|
||||
for i := 0 to NCases - 1 do
|
||||
lReport.Add(' Object %5d Mean: %8.3f', [i+1, CaseYMeans[i]]);
|
||||
lReport.Add('');
|
||||
lReport.Add('MEAN SIZE VALUES FOR EACH BUBBLE (OBJECT)');
|
||||
for i := 0 to ncases - 1 do
|
||||
lReport.Add('Object %5d Mean := %8.3f', [i+1, CaseSizeMeans[i]]);
|
||||
for i := 0 to NCases - 1 do
|
||||
lReport.Add(' Object %5d Mean: %8.3f', [i+1, CaseSizeMeans[i]]);
|
||||
|
||||
DisplayReport(lReport);
|
||||
// Show the report
|
||||
if DisplayReport(lReport) then
|
||||
// Plot the bubbles
|
||||
PlotBubbles(
|
||||
{$IFNDEF USE_TACHART}NoReplications, XMax, XMin, {$ENDIF}
|
||||
YMax, YMin, BubMax, BubMin
|
||||
);
|
||||
|
||||
finally
|
||||
lReport.Free;
|
||||
@ -285,97 +269,15 @@ begin
|
||||
CaseYMeans := nil;
|
||||
end;
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Plotting Section
|
||||
//---------------------------------------------------------------------------
|
||||
//BlankFrm.Image1.Canvas.Clear;
|
||||
BlankFrm.Show;
|
||||
BlankFrm.Caption := 'BUBBLE PLOT of ' + OS3MainFrm.FileNameEdit.Text;
|
||||
Xlabel := XlabelEdit.Text;
|
||||
Ylabel := YlabelEdit.Text;
|
||||
Title := TitleEdit.Text;
|
||||
ImageHi := BlankFrm.Image1.Height;
|
||||
ImageWide := BlankFrm.Image1.Width;
|
||||
Xstart := ImageWide div 10;
|
||||
Xend := (ImageWide * 9) div 10;
|
||||
Ystart := ImageHi div 10;
|
||||
Yend := (ImageHi * 8) div 10;
|
||||
BlankFrm.Image1.Canvas.Pen.Color := clBlack;
|
||||
BlankFrm.Image1.Canvas.Brush.Color := clWhite;
|
||||
BlankFrm.Image1.Canvas.Rectangle(0,0,ImageWide,ImageHi);
|
||||
BlankFrm.Image1.Canvas.FloodFill(0,0,clWhite,fsBorder);
|
||||
BlankFrm.Image1.Canvas.TextOut(Xstart-10,Ystart-30,Ylabel);
|
||||
LabelWide := BlankFrm.Image1.Canvas.TextWidth(Xlabel);
|
||||
BlankFrm.Image1.Canvas.TextOut((Xend-Xstart) div 2 - LabelWide,Yend + 40,Xlabel);
|
||||
LabelWide := BlankFrm.Image1.Canvas.TextWidth(Title);
|
||||
BlankFrm.Image1.Canvas.TextOut((Xend-Xstart) div 2 - LabelWide div 2, Ystart - 40,Title);
|
||||
|
||||
// draw axis lines
|
||||
BlankFrm.Image1.Canvas.MoveTo(Xstart,Yend);
|
||||
BlankFrm.Image1.Canvas.LineTo(Xend,Yend);
|
||||
BlankFrm.Image1.Canvas.MoveTo(Xstart,Yend);
|
||||
BlankFrm.Image1.Canvas.LineTo(Xstart,Ystart);
|
||||
|
||||
// create y axis values
|
||||
Yincr := (Yend - Ystart) div 10;
|
||||
for i := 0 to 10 do // print Y axis values
|
||||
begin
|
||||
place := Yend - (i * Yincr);
|
||||
value := Ymin + (Ystep * i);
|
||||
valstr := format('%.2f',[value]);
|
||||
astring := valstr;
|
||||
TextHi := BlankFrm.Image1.Canvas.TextHeight(astring);
|
||||
BlankFrm.Image1.Canvas.TextOut(Xstart-30,place-TextHi,astring);
|
||||
end;
|
||||
|
||||
// create x axis values
|
||||
for i := 1 to noreplications do // print x axis
|
||||
begin
|
||||
value := Xmin + ((i-1) * Xstep);
|
||||
ratio := i / noreplications;
|
||||
Xpos := round(ratio * (Xend - Xstart));
|
||||
valstr := format('%.0f',[value]);
|
||||
astring := valstr;
|
||||
BlankFrm.Image1.Canvas.TextOut(Xpos,Yend + 20,astring);
|
||||
end;
|
||||
|
||||
// Plot the bubbles
|
||||
for i := 1 to NoCases do
|
||||
begin
|
||||
intcell := StrToInt(OS3MainFrm.DataGrid.Cells[BubbleCol,i]);
|
||||
xvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]);
|
||||
cellvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]);
|
||||
yprop := Yend - round(((cellvalue-Ymin) / Yrange) * (Yend - Ystart));
|
||||
cellvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[SizeCol,i]);
|
||||
astring := Trim(OS3MainFrm.DataGrid.Cells[BubbleCol,i]);
|
||||
cellvalue := ((cellvalue - BubMin) / BubRange) * 20;
|
||||
cellvalue := cellvalue + 10;
|
||||
ratio := ((xvalue - Xmin) / Xstep) + 1;
|
||||
ratio := (ratio / noreplications) * (Xend - Xstart);
|
||||
Xpos := ceil(ratio);
|
||||
BubColor := intcell - 1;
|
||||
while (Bubcolor > 11) do Bubcolor := 12 - Bubcolor;
|
||||
BlankFrm.Image1.Canvas.Brush.Color := DATA_COLORS[Bubcolor];
|
||||
X1 := Xpos - ceil(cellvalue);
|
||||
Y1 := yprop - ceil(cellvalue);
|
||||
X2 := Xpos + ceil(cellvalue);
|
||||
Y2 := yprop + ceil(cellvalue);
|
||||
BlankFrm.Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
|
||||
BlankFrm.Image1.Canvas.Brush.Color := clWhite;
|
||||
dx := BlankFrm.Image1.Canvas.TextWidth(astring) div 2;
|
||||
dy := BlankFrm.Image1.Canvas.TextHeight(astring) div 2;
|
||||
BlankFrm.Image1.Canvas.TextOut(Xpos-dx, yprop-dy, astring);
|
||||
end;
|
||||
|
||||
// Transform data matrix if elected
|
||||
if (TransformChk.Checked = true) then
|
||||
if TransformChk.Checked then
|
||||
begin
|
||||
ncases := nobubbles;
|
||||
ncols := noreplications * 3 + 1;
|
||||
|
||||
// Note - columns: 1:=object ID, 2 to noreplications := X,
|
||||
// next noreplications := Y, next noreplications := size
|
||||
SetLength(Data,ncases,ncols);
|
||||
SetLength(Data, ncases, ncols);
|
||||
i := 1;
|
||||
while (i <= NoCases) do
|
||||
begin
|
||||
@ -393,7 +295,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
SetLength(labels,NoVariables+1);
|
||||
SetLength(labels, NoVariables+1);
|
||||
for i := 1 to NoVariables do labels[i] := OS3MainFrm.DataGrid.Cells[i,0];
|
||||
ClearGrid;
|
||||
OS3MainFrm.DataGrid.RowCount := ncases + 1;
|
||||
@ -462,6 +364,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.FormActivate(Sender: TObject);
|
||||
var
|
||||
w: Integer;
|
||||
@ -484,18 +387,39 @@ begin
|
||||
FAutoSized := True;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
Assert(OS3MainFrm <> nil);
|
||||
if DictionaryFrm = nil then Application.CreateForm(TDictionaryFrm, DictionaryFrm);
|
||||
if BlankFrm = nil then Application.CreateForm(TBlankFrm, BlankFrm);
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.FormShow(Sender: TObject);
|
||||
begin
|
||||
ResetBtnClick(self);
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.IDInBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i := 0;
|
||||
while (BubbleEdit.Text = '') and (i < VarList.Items.Count) do
|
||||
begin
|
||||
if (VarList.Selected[i]) then
|
||||
begin
|
||||
BubbleEdit.Text := VarList.Items[i];
|
||||
VarList.Items.Delete(i);
|
||||
i := 0;
|
||||
end else
|
||||
inc(i);
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.IDOutBtnClick(Sender: TObject);
|
||||
begin
|
||||
if BubbleEdit.Text <> '' then
|
||||
@ -503,6 +427,198 @@ begin
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.HelpBtnClick(Sender: TObject);
|
||||
begin
|
||||
if ContextHelpForm = nil then
|
||||
Application.CreateForm(TContextHelpForm, ContextHelpForm);
|
||||
ContextHelpForm.HelpMessage((Sender as TButton).Tag);
|
||||
end;
|
||||
|
||||
|
||||
{$IFDEF USE_TACHART}
|
||||
procedure TBubbleForm.PlotBubbles(YMax, YMin, BubMax, BubMin: Double);
|
||||
var
|
||||
ser: TBubbleSeries;
|
||||
bubbleIDs: TStringList;
|
||||
i, j: Integer;
|
||||
id: Integer;
|
||||
xValue, yValue, sizeValue: Double;
|
||||
s: String;
|
||||
yRange, bubRange: Double;
|
||||
begin
|
||||
yRange := YMax - YMin;
|
||||
BubRange := BubMax - BubMin;
|
||||
|
||||
if ChartForm = nil then
|
||||
ChartForm := TChartForm.Create(Application)
|
||||
else
|
||||
ChartForm.Clear;
|
||||
|
||||
// Titles
|
||||
ChartForm.Caption := 'Bubble Plot of ' + OS3MainFrm.FileNameEdit.Text + LineEnding + TitleEdit.Text;
|
||||
ChartForm.SetTitle(TitleEdit.Text);
|
||||
if XLabelEdit.Text <> '' then
|
||||
ChartForm.SetXTitle(XLabelEdit.Text)
|
||||
else
|
||||
ChartForm.SetXTitle(XEdit.Text);
|
||||
if YLabelEdit.Text <> '' then
|
||||
ChartForm.SetYTitle(YLabelEdit.Text)
|
||||
else
|
||||
ChartForm.SetYTitle(YEdit.Text);
|
||||
|
||||
// Collect bubble IDs and create a bubble series for each unique ID.
|
||||
bubbleIDs := TStringList.Create;
|
||||
try
|
||||
for i := 1 to NoCases do
|
||||
begin
|
||||
s := OS3MainFrm.DataGrid.Cells[BubbleCol, i];
|
||||
if bubbleIDs.IndexOf(s) = -1 then // Add each ID only once!
|
||||
bubbleIDs.Add(s);
|
||||
end;
|
||||
for i := 0 to bubbleIDs.Count-1 do
|
||||
begin
|
||||
ser := TBubbleSeries.Create(ChartForm);
|
||||
ser.BubbleBrush.Color := DATA_COLORS[i mod Length(DATA_COLORS)];
|
||||
ser.BubbleRadiusUnits := bruY;
|
||||
ser.Title := bubbleIDs[i];
|
||||
ser.Tag := StrToInt(bubbleIDs[i]);
|
||||
ChartForm.Chart.AddSeries(ser);
|
||||
end;
|
||||
finally
|
||||
bubbleIDs.Free;
|
||||
end;
|
||||
|
||||
for i := 1 to NoCases do begin
|
||||
id := StrToInt(OS3MainFrm.DataGrid.Cells[BubbleCol, i]);
|
||||
// Find the series having this ID
|
||||
for j := 0 to ChartForm.Chart.SeriesCount-1 do
|
||||
if (ChartForm.Chart.Series[j] is TBubbleSeries) and
|
||||
(TBubbleSeries(ChartForm.Chart.Series[j]).Tag = id) then
|
||||
begin
|
||||
ser := TBubbleSeries(ChartForm.Chart.Series[j]);
|
||||
break;
|
||||
end;
|
||||
|
||||
xValue := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol, i]);
|
||||
yValue := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol, i]);
|
||||
sizeValue := StrToFloat(OS3MainFrm.DataGrid.Cells[SizeCol, i]);
|
||||
sizeValue := ((sizeValue - BubMin) / BubRange * 0.91 + 0.09) * YRange * 0.1;
|
||||
// This scaling makes the larges bubble equal to 10% of the y range;
|
||||
// the ratio of largest to smallest bubble is about 10:1.
|
||||
|
||||
ser.AddXY(xValue, yValue, sizeValue);
|
||||
end;
|
||||
|
||||
ChartForm.Chart.Legend.Visible := true;
|
||||
ChartForm.Show;
|
||||
end;
|
||||
{$ELSE}
|
||||
procedure TBubbleForm.PlotBubbles(NoReplications: Integer;
|
||||
XMax, XMin: Integer; YMax, YMin, BubMax, BubMin: Double);
|
||||
var
|
||||
i, j: Integer;
|
||||
XLabel, YLabel, Title, valStr, aString: String;
|
||||
ImageWide, ImageHi, Xstart, Xend, Ystart, Yend, Yincr: integer;
|
||||
LabelWide, TextHi, Xpos: Integer;
|
||||
BubColor, place: integer;
|
||||
X1, Y1, X2, Y2: integer;
|
||||
dx, dy: Integer;
|
||||
XRange, XStep: Integer;
|
||||
YRange, YStep, BubRange: Double;
|
||||
ratio, value: Double;
|
||||
intCell: Integer;
|
||||
xValue, cellvalue: Double;
|
||||
yProp: Integer;
|
||||
begin
|
||||
if BlankFrm = nil then
|
||||
BlankFrm := TBlankFrm.Create(Application);
|
||||
|
||||
XRange := Xmax - Xmin;
|
||||
XStep := XRange div (NoReplications - 1);
|
||||
YRange := Ymax - Ymin;
|
||||
YStep := Yrange / 10;
|
||||
BubRange := BubMax - BubMin;
|
||||
|
||||
BlankFrm.Show;
|
||||
BlankFrm.Caption := 'BUBBLE PLOT of ' + OS3MainFrm.FileNameEdit.Text;
|
||||
Xlabel := XlabelEdit.Text;
|
||||
Ylabel := YlabelEdit.Text;
|
||||
Title := TitleEdit.Text;
|
||||
ImageHi := BlankFrm.Image1.Height;
|
||||
ImageWide := BlankFrm.Image1.Width;
|
||||
Xstart := ImageWide div 10;
|
||||
Xend := (ImageWide * 9) div 10;
|
||||
Ystart := ImageHi div 10;
|
||||
Yend := (ImageHi * 8) div 10;
|
||||
BlankFrm.Image1.Canvas.Pen.Color := clBlack;
|
||||
BlankFrm.Image1.Canvas.Brush.Color := clWhite;
|
||||
BlankFrm.Image1.Canvas.Rectangle(0,0,ImageWide,ImageHi);
|
||||
BlankFrm.Image1.Canvas.FloodFill(0,0,clWhite,fsBorder);
|
||||
BlankFrm.Image1.Canvas.TextOut(Xstart-10,Ystart-30,Ylabel);
|
||||
LabelWide := BlankFrm.Image1.Canvas.TextWidth(Xlabel);
|
||||
BlankFrm.Image1.Canvas.TextOut((Xend-Xstart) div 2 - LabelWide,Yend + 40,Xlabel);
|
||||
LabelWide := BlankFrm.Image1.Canvas.TextWidth(Title);
|
||||
BlankFrm.Image1.Canvas.TextOut((Xend-Xstart) div 2 - LabelWide div 2, Ystart - 40,Title);
|
||||
|
||||
// draw axis lines
|
||||
BlankFrm.Image1.Canvas.MoveTo(Xstart,Yend);
|
||||
BlankFrm.Image1.Canvas.LineTo(Xend,Yend);
|
||||
BlankFrm.Image1.Canvas.MoveTo(Xstart,Yend);
|
||||
BlankFrm.Image1.Canvas.LineTo(Xstart,Ystart);
|
||||
|
||||
// create y axis values
|
||||
Yincr := (Yend - Ystart) div 10;
|
||||
for i := 0 to 10 do // print Y axis values
|
||||
begin
|
||||
place := Yend - Yincr * i;
|
||||
value := Ymin + Ystep * i;
|
||||
valStr := Format('%.2f', [value]);
|
||||
TextHi := BlankFrm.Image1.Canvas.TextHeight(valStr);
|
||||
BlankFrm.Image1.Canvas.TextOut(Xstart-30,place-TextHi, valStr);
|
||||
end;
|
||||
|
||||
// create x axis values
|
||||
for i := 1 to NoReplications do // print x axis
|
||||
begin
|
||||
value := Xmin + ((i-1) * Xstep);
|
||||
ratio := i / NoReplications;
|
||||
Xpos := round(ratio * (Xend - Xstart));
|
||||
valStr := Format('%.0f',[value]);
|
||||
BlankFrm.Image1.Canvas.TextOut(Xpos,Yend + 20, valStr);
|
||||
end;
|
||||
|
||||
// Plot the bubbles
|
||||
for i := 1 to NoCases do
|
||||
begin
|
||||
intcell := StrToInt(OS3MainFrm.DataGrid.Cells[BubbleCol,i]);
|
||||
xvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]);
|
||||
cellvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]);
|
||||
yprop := Yend - round(((cellvalue-Ymin) / Yrange) * (Yend - Ystart));
|
||||
cellvalue := StrToFloat(OS3MainFrm.DataGrid.Cells[SizeCol,i]);
|
||||
astring := Trim(OS3MainFrm.DataGrid.Cells[BubbleCol,i]);
|
||||
cellvalue := ((cellvalue - BubMin) / BubRange) * 20;
|
||||
cellvalue := cellvalue + 10;
|
||||
ratio := ((xvalue - Xmin) / Xstep) + 1;
|
||||
ratio := (ratio / noreplications) * (Xend - Xstart);
|
||||
Xpos := ceil(ratio);
|
||||
BubColor := intcell - 1;
|
||||
while (Bubcolor > 11) do Bubcolor := 12 - Bubcolor;
|
||||
BlankFrm.Image1.Canvas.Brush.Color := DATA_COLORS[Bubcolor];
|
||||
X1 := Xpos - ceil(cellvalue);
|
||||
Y1 := yprop - ceil(cellvalue);
|
||||
X2 := Xpos + ceil(cellvalue);
|
||||
Y2 := yprop + ceil(cellvalue);
|
||||
BlankFrm.Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
|
||||
BlankFrm.Image1.Canvas.Brush.Color := clWhite;
|
||||
dx := BlankFrm.Image1.Canvas.TextWidth(astring) div 2;
|
||||
dy := BlankFrm.Image1.Canvas.TextHeight(astring) div 2;
|
||||
BlankFrm.Image1.Canvas.TextOut(Xpos-dx, yprop-dy, astring);
|
||||
end;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
procedure TBubbleForm.ResetBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
@ -517,6 +633,7 @@ begin
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.SizeInBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
@ -535,6 +652,7 @@ begin
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.SizeOutBtnClick(Sender: TObject);
|
||||
begin
|
||||
if SizeEdit.Text <> '' then
|
||||
@ -542,60 +660,6 @@ begin
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.VarListSelectionChange(Sender: TObject; User: boolean);
|
||||
begin
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.XInBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i := 0;
|
||||
while (XEdit.Text = '') and (i < VarList.Items.Count) do
|
||||
begin
|
||||
if VarList.Selected[i] then
|
||||
begin
|
||||
XEdit.Text := VarList.Items[i];
|
||||
VarList.Items.Delete(i);
|
||||
i := 0;
|
||||
end else
|
||||
inc(i);
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.XOutBtnClick(Sender: TObject);
|
||||
begin
|
||||
if XEdit.Text <> '' then
|
||||
VarList.Items.Add(XEdit.Text);
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.YInBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i := 0;
|
||||
while (YEdit.Text = '') and (i < VarList.Items.Count) do
|
||||
begin
|
||||
if VarList.Selected[i] then
|
||||
begin
|
||||
YEdit.Text := VarList.Items[i];
|
||||
VarList.Items.Delete(i);
|
||||
i := 0;
|
||||
end else
|
||||
inc(i);
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.YOutBtnClick(Sender: TObject);
|
||||
begin
|
||||
if YEdit.Text <> '' then
|
||||
VarList.Items.Add(YEdit.Text);
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TBubbleForm.UpdateBtnStates;
|
||||
var
|
||||
@ -621,8 +685,65 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
initialization
|
||||
{$I bubbleplotunit.lrs}
|
||||
procedure TBubbleForm.VarListSelectionChange(Sender: TObject; User: boolean);
|
||||
begin
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.XInBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i := 0;
|
||||
while (XEdit.Text = '') and (i < VarList.Items.Count) do
|
||||
begin
|
||||
if VarList.Selected[i] then
|
||||
begin
|
||||
XEdit.Text := VarList.Items[i];
|
||||
VarList.Items.Delete(i);
|
||||
i := 0;
|
||||
end else
|
||||
inc(i);
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.XOutBtnClick(Sender: TObject);
|
||||
begin
|
||||
if XEdit.Text <> '' then
|
||||
VarList.Items.Add(XEdit.Text);
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.YInBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i := 0;
|
||||
while (YEdit.Text = '') and (i < VarList.Items.Count) do
|
||||
begin
|
||||
if VarList.Selected[i] then
|
||||
begin
|
||||
YEdit.Text := VarList.Items[i];
|
||||
VarList.Items.Delete(i);
|
||||
i := 0;
|
||||
end else
|
||||
inc(i);
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
procedure TBubbleForm.YOutBtnClick(Sender: TObject);
|
||||
begin
|
||||
if YEdit.Text <> '' then
|
||||
VarList.Items.Add(YEdit.Text);
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
||||
|
@ -69,6 +69,7 @@ uses
|
||||
|
||||
procedure TChartForm.Clear;
|
||||
begin
|
||||
Caption := 'Plot Window';
|
||||
Chart.ClearSeries;
|
||||
Chart.Title.Text.Clear;
|
||||
Chart.Foot.Text.Clear;
|
||||
|
Loading…
Reference in New Issue
Block a user