I have plotted some data with a log scale on both axes as shown in the image below. I want to be able to fit this data such that the fit appears as linear on this log-log plot but I haven't been able to get the fit to work.

enter image description here

I have tried both fitting the original data without the log scaling and then converting the fit into a log scale but this generated an incorrect fit. What is the best way of doing this?

  • 1
    $\begingroup$ Make a linear fit on Log[data]? $\endgroup$ Commented Aug 31, 2018 at 16:59
  • 2
    $\begingroup$ Would you be so kind as to share the actual Mathematica code you are having trouble with? Have you tried regressing Log[Intensity] on Log[Laser Power] and a constant? $\endgroup$ Commented Aug 31, 2018 at 17:05

2 Answers 2


Contrary to my former comment, if one has a reason to expect a power law directly between the observed quantities, fitting a nonlinear model is a better idea since otherwise the random distribution of the error gets distorted.

The following produces x-y pairs with a power law with a normally distributed error on the y-coordinates.

n = 1000;
x = Subdivide[2., 4., n - 1];
b = RandomReal[{1, 4}];
a = RandomReal[{1, 20}];
c = RandomReal[{0, 20}];
y = a x^b + c + RandomVariate[NormalDistribution[0, 15], n]

Desing a model and with the parameters to the data with FindFit.

model = α t^β + γ;
fit = t \[Function] Evaluate[ model /. FindFit[Transpose[{x, y}], model, {α, β, γ}, t]];

Plotting in log-log scales:

 ListLinePlot[Transpose[{x, y}], ScalingFunctions -> {"Log", "Log"}],
 Plot[fit[t], {t, Min[x], Max[x]}, PlotStyle -> Red, 
  ScalingFunctions -> {"Log", "Log"}]

enter image description here

  • 1
    $\begingroup$ +1 Thanks for pointing out that the error structure is an essential part of the model, too. $\endgroup$
    – JimB
    Commented Aug 31, 2018 at 17:43
  • $\begingroup$ @JimB Always at you service. =) $\endgroup$ Commented Aug 31, 2018 at 18:00

If Log10[10^x] gives a line in a LogLog plot, then using it as Linear fit should work. Example:

datay = {500, 1000, 3000, 5000, 10000};
datax = {50, 100, 300, 500, 1000};
ListLogLogPlot[Transpose@{datax, datay}, Joined -> True]
lm = LinearModelFit[Log10[datay], Log10[10^x], x]
ListLogLogPlot[Transpose@{Table[lm[x], {x, datax}], datax}, 
 Joined -> True]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.