I think you are using the axistransformations for something they were not designed for.

Just for explanation let's assume that you want a log presentation of your data, say: in the range between 1 and 1000. This means: your data in their "own" units, or "axis" units in TAChart speak, are in the range between 1 and 1000. The log axis transformation calculates the log and creates values in "graph" units which are the logs of the "axis" units. The chart plots graph units. These are numbers in the range between log(1)=1 and log(1000)=3. But you don't want "graph" units on the axis - you want the real data units, i.e. the "axis" units. Therefore, for labeling the axis, the chart calculates the inverse transformation of the transformed values (i.e. it calculates the exponential of the log values) to return the numbers back into axis units. Therefore, the chart can plot the numbers in log units (1..3), but labels the axis in the real units (1..1000).

Your request is different: you want to transform the input values (Fahrenheit) to Kelvin by means of the LinearAxisTransform, but you want to label the axis in K too. However, since the chart performs the inverse transformation for the axis labels, you end up with the Fahrenheit numbers on the axis again...

Normally you can "fix" this when you do not link the series to the axis, i.e. return AxisIndexY to -1, but keep the LinearAxisTransform attached to the axis. This way the chart plots the original values (Fahrenheit), but the axis is labeled in Kelvin... A bit counter-intuitive, I know... I am attaching the modified project as "1-series.zip".

This does not work for you in your case since you do need the transformation linked to the series because you want to auto-scale both series. So, you cannot use your approach. Sorry.

But why don't you convert the numbers to K before you add them to the series?

Ideally, I think, there should be some kind of "TransformedChartSource" which does some calculation with the data values before they are passed on to the chart. Maybe I should write something like this...

On the other hand, it is already there: the TUserDefinedChartSource. Link the series to the UserDefinedChartSource and pass your data through it by means of the OnGetChartDataItem event where you immediately can perform the transformation. See attached modified demo.

function FahrenheitToKelvin(F: Double): Double;

begin

Result := (F - 32) / 1.8 + 273.15;

end;

// The user-defined chart source is named "ucdTWinter" here...

procedure TForm1.ucsTWinterGetChartDataItem(ASource: TUserDefinedChartSource;

AIndex: Integer; var AItem: TChartDataItem);

begin

// rcsTWinter is the chart source which stores the original data

AItem.X := rcsTWinter.Item[AIndex]^.X;

AItem.Y := FahrenheitToKelvin(rcsTWinter.Item[AIndex]^.Y);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

// Link the user-defined chartsource to the series

ChartTWinterLine.Source := ucsTWinter;

// Setting the points number makes the user-defined series usable.

ucsTWinter.PointsNumber := rcsTWinter.Count;

end;