Set color gradient based on time series

TeeChart VCL for Borland/CodeGear/Embarcadero RAD Studio, Delphi and C++ Builder.
Post Reply
DataInspector
Newbie
Newbie
Posts: 5
Joined: Mon Sep 09, 2019 12:00 am

Set color gradient based on time series

Post by DataInspector » Tue Jun 13, 2023 12:54 am

How do I automatically set a color gradient based on date. I want to be able to visually establish a how my data set may have changed through time, specifically in a triangular plot.

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Set color gradient based on time series

Post by Yeray » Tue Jun 13, 2023 12:35 pm

Hello,

Could you please show us some image about what would you like to get?
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

DataInspector
Newbie
Newbie
Posts: 2
Joined: Mon Aug 08, 2022 12:00 am

Re: Set color gradient based on time series

Post by DataInspector » Tue Jun 13, 2023 9:37 pm

Attached is a concept

Here is the code I am currently using

Code: Select all

/// This procedure relies on data in the FDMemTableTri to produce the Trilear
/// Chart.  The user chooses three analytes from LookupList boxes and then uses
/// a RadioGroup Box to assign series based on Media, Sample Type, Location, etc.
/// FDMemTable is then indexed based on RadioGroup choice.  The procedure then
/// runs through FDMemTableTri to get the data.

procedure TfmAnalyticalGraphs.FillTriPlotSeries;
Var
  TriPlotSeries : TTernarySeries;
  NameNew, NameOld: String; ///These variables are used to evaluate when the end of a series is reached, and then the name of the next series.
  PStyle : TSeriesPointerStyle;
  SeriesColor : TColor;
  k, m : integer;
Begin
 ChartTriPlot.SeriesList.Clear;
 ChartTriPlot.Walls.Back.Hide;
 ChartTriPlot.Gradient.Visible:=False;
 ChartTriPlot.Color:=clWhite;
 k := 0;
 m := 0;
  with TTernarySeries(ChartTriPlot.AddSeries(TTernarySeries)) do
    begin
      ShowInLegend:=False;
      AddNull;
      VertexTitles[0].Text := cxLookupComboBoxTriAnal2.EditText;
      VertexTitles[1].Text := cxLookupComboBoxTriAnal3.EditText;
      VertexTitles[2].Text := cxLookupComboBoxTriAnal1.EditText;
    end;

 ///Set Index by Radio Group - These become the means of setting up series such as "By Media" or By "Sample Type".
 ///For example - "By Media" could produce four series called "Groundwater", "Soil", "Sediment", and "Surface Water"
 FDMemTableTri.IndexesActive := False;
    case cxRadioGroupTri.ItemIndex of
      0 : FDMemTableTri.IndexFieldNames := 'Media_PK';
      1 : FDMemTableTri.IndexFieldNames := 'Sample_Type_PK';
      2 : FDMemTableTri.IndexFieldNames := 'Locations_PK';
      3 : FDMemTableTri.IndexFieldNames := 'Sample_Event_PK';
      4 : FDMemTableTri.IndexFieldNames := 'Sample_Date';
      5 : FDMemTableTri.IndexFieldNames := 'Sample_Depth_Top';
      6 : FDMemTableTri.IndexFieldNames := 'Inventory_PK';
      7 : FDMemTableTri.IndexFieldNames := 'Sample_PK';
    end;

 FDMemTableTri.IndexesActive := True;
  with FDMemTableTri do
    begin
      DisableControls;
       try
        First;
          case cxRadioGroupTri.ItemIndex of
            0 : NameNew := FDMemTableTriMEDIA.AsString;
            1 : NameNew := FDMemTableTriSAMPLE_TYPE.AsString;
            2 : NameNew := FDMemTableTriLOCATION.AsString;
            3 : NameNew := FDMemTableTriSAMPLE_EVENT_NAME.AsString;
            4 : NameNew := FDMemTableTriSAMPLE_DATE.AsString;
            5 : NameNew := FDMemTableTriSAMPLE_DEPTH_TOP.AsString;
            6 : NameNew := FDMemTableTriINVENTORY_NAME.AsString;
            7 : NameNew := FDMemTableTriSAMPLE_NAME.AsString;
          end;
        while not(EOF) do
          Begin
             NameOld := NameNew;
               with ChartTriPlot.AddSeries(TTernarySeries) as TTernarySeries do
                 begin
                  Title := NameOld;
                  UseColorRange:=False;
                  UsePalette:=False;
                  ColorEachPoint:=False;
                  pointer.Size := 10;
                  pointer.Visible := True;

                    case k of
                      0 : SeriesColor := clRed;
                      1 : SeriesColor := clBlue;
                      2 : SeriesColor := clLime;
                      3 : SeriesColor := clYellow;
                      4 : SeriesColor := clMaroon;
                      5 : SeriesColor := clTeal;
                      6 : SeriesColor := clFuchsia;
                      7 : SeriesColor := clBlack;
                      8 : SeriesColor := clAqua;
                      9 : SeriesColor := clNavy;
                      10 : SeriesColor := clGreen;
                      11 : SeriesColor := clPurple;
                      12 : SeriesColor := clGray;
                      13 : SeriesColor := clSilver;
                      14 : SeriesColor := clOlive;
                      15 : SeriesColor := clMoneyGreen;
                      16 : SeriesColor := clSkyBlue;
                      17 : SeriesColor := clMedGray;
                    end;

                     case m of
                      0 : PStyle := psDonut;
                      1 : PStyle := psRectangle;
                      2 : PStyle := psTriangle;
                      3 : PStyle := psDownTriangle;
                      4 : PStyle := psStar;
                      5 : PStyle := psDiamond;
                      6 : PStyle := psCross;
                      7 : PStyle := psDiagCross;
                      8 : PStyle := psLeftTriangle;
                      9 : PStyle := psRightTriangle;
                      10 : PStyle := psCircle;
                    end;

                  pointer.Style := PStyle;
                  pointer.Color := SeriesColor;

                    while NameOld = NameNew do
                      begin
                        if cxCheckBoxTriIgnoreND.Checked then   //This is different than Cross Plot and Time Series.  Here we assume a ND to be zero
                           AddXYZ(FindField('Analyte2Result').AsFloat, FindField('Analyte3Result').AsFloat, FindField('RESULT').AsFloat)
                        else  //The fields listed below will be either the detected Result or 0
                           AddXYZ(FindField('Analyte2Result_ND').AsFloat, FindField('Analyte3Result_ND').AsFloat, FindField('RESULT_ND').AsFloat);

                       if Not (EOF) then
                         Begin
                          next;
                            case cxRadioGroupTri.ItemIndex of
                               0 : NameNew := FDMemTableTriMEDIA.AsString;
                               1 : NameNew := FDMemTableTriSAMPLE_TYPE.AsString;
                               2 : NameNew := FDMemTableTriLOCATION.AsString;
                               3 : NameNew := FDMemTableTriSAMPLE_EVENT_NAME.AsString;
                               4 : NameNew := FDMemTableTriSAMPLE_DATE.AsString;
                               5 : NameNew := FDMemTableTriSAMPLE_DEPTH_TOP.AsString;
                               6 : NameNew := FDMemTableTriINVENTORY_NAME.AsString;
                               7 : NameNew := FDMemTableTriSAMPLE_NAME.AsString;
                            end;
                         end
                       else
                        Break;
                      end;
                     inc(k);
                       if k = 18 then
                         begin
                          k := 0;
                          inc(m);
                         end;
                 end;
            end;
       finally
         EnableControls;
       end;
    end;
end;
Attachments
Trilinear Plot.jpg
Trilinear Plot.jpg (53.29 KiB) Viewed 11440 times

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Set color gradient based on time series

Post by Yeray » Wed Jun 14, 2023 7:09 am

Hello,

I would use a TTernarySeries and use ApplyBright function to define the color of each point from the series base color and calculating the HowMuch argument (0-255) depending on the date, probably coming from the database.
Project1_2023-06-14_09-09-10.png
Project1_2023-06-14_09-09-10.png (28.72 KiB) Viewed 11433 times

Code: Select all

uses TeeTernary, TeCanvas;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  Chart1.Align:=alClient;

  Chart1.View3D:=False;
  Chart1.Color:=clWhite;
  Chart1.Gradient.Visible:=False;
  Chart1.Walls.Back.Color:=clWhite;
  Chart1.Walls.Back.Gradient.Visible:=False;
  Chart1.Legend.Hide;

  with TTernarySeries(Chart1.AddSeries(TTernarySeries)) do
  begin
    Pointer.Style:=psDonut;
    Pointer.Size:=10;

    UseColorRange:=False;
    UsePalette:=False;
    ColorEachPoint:=False;

    FillSampleValues;

    for i:=0 to Count-1 do
      ValueColor[i]:=ApplyBright(Color, Round(random*255));  // change the second argument for a value date - dependant
  end;
end;
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

DataInspector
Newbie
Newbie
Posts: 2
Joined: Mon Aug 08, 2022 12:00 am

Re: Set color gradient based on time series

Post by DataInspector » Wed Jun 14, 2023 6:02 pm

Thanks for the advice. I couldn't find a lot of information for ApplyBright and have a question.

What are the range of integers allowed?

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Set color gradient based on time series

Post by Yeray » Wed Jun 14, 2023 7:16 pm

Hello,

It allows 0 to 255.
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Post Reply