2
$\begingroup$

I'm using the function ListLogLinearPlot, but the plot is to square, i would like to have InterpolationOrder 2, but there is not this command for the function.

I tried to make my own interpolation, creating a function which create more points between my pre-existing points:

Int1[p0_, n0_] := 
 Module[{p = p0, n = n0, i, j, a, b, l = {}, x, y},
  Table[
   a = (p[[i + 1, 1]] - p[[i, 1]])/(n + 1);
   b = (p[[i + 1, 2]] - p[[i, 2]])/(n + 1);
   Table[
    x = p[[i, 1]] + a*j;
    y = p[[i, 2]] + b*j;
    AppendTo[l, {x, y}];
    , {j, 0, n}
    ]
   , {i, 1, Length[p] - 1}
   ];
  AppendTo[l, p[[-1]]];
  l
  ]
nn = 3;
Int1[Points, nn];

But, i can't make it works

@MarcoB

PSt = {RGBColor[0, 0.5, 0.8], 
  Thickness[0.005]}; PSa = {RGBColor[0.5, 0.5, 0.5], Thickness[0.003]};
PSb = {RGBColor[0.3, 0.3, 0.3], 
  Thickness[0.002]}; PSc = {RGBColor[0.3, 0.3, 0.3], Thickness[0.001]};

FinosCA = {{0, 0}, {0.15, 2}, {0.3, 10}, {0.6, 25}, {1.18, 50}, {2.36,
     80}, {4.75, 95}, {9.5, 100}};
FinosCB = {{0, 0}, {0.15, 10}, {0.3, 30}, {0.6, 60}, {1.18, 
    85}, {2.36, 100}, {4.75, 100}, {9.5, 100}};
FinosCC = {{0, 0}, {0.15, 10}, {0.3, 50}, {0.6, 95}, {1.18, 
    100}, {2.36, 100}, {4.75, 100}, {9.5, 100}};
FinosCM = {{0, 0.34}, {0.15, 2.6}, {0.3, 26.68}, {0.6, 96.60}, {1.18, 
    99.64}, {2.36, 99.94}, {4.75, 100}, {9.5, 100}};
nn = 50
ListLogLinearPlot[{FinosCA, FinosCB, FinosCC, FinosCM}, 
 Joined -> True, AspectRatio -> 1/GoldenRatio, 
 AxesLabel -> {"Diamentro de malla\ndel tamiz [mm]", 
   "% Pasante Acumulado"}, LabelStyle -> Directive[FontSize -> 14], 
 ImageSize -> 650, PlotStyle -> {PSa, PSb, PSc, PSt}]
ListLogLinearPlot[{Int1[FinosCA, nn], Int1[FinosCB, nn], 
  Int1[FinosCC, nn], Int1[FinosCM, nn]}, Joined -> True, 
 AspectRatio -> 1/GoldenRatio, 
 AxesLabel -> {"Diamentro de malla\ndel tamiz [mm]", 
   "% Pasante Acumulado"}, LabelStyle -> Directive[FontSize -> 14], 
 ImageSize -> 650, PlotStyle -> {PSa, PSb, PSc, PSt}]

enter image description here

$\endgroup$
  • $\begingroup$ Could you include your existing points, the code you have used so far, and maybe an example of output? $\endgroup$ – MarcoB Jul 3 '15 at 20:32
  • $\begingroup$ @MarcoB I changed the post $\endgroup$ – Gonzalo Jul 3 '15 at 20:44
  • $\begingroup$ Gonzalo, thanks for the update. Could you expand a little on what exactly you would like to accomplish as well? I'm afraid that I did not completely understand what you need to do. Do you want a "smoother" plot? Or do you want perhaps a fit function? $\endgroup$ – MarcoB Jul 3 '15 at 20:46
  • $\begingroup$ @MarcoB i want... a curve line instead of a rect-poliline $\endgroup$ – Gonzalo Jul 3 '15 at 20:51
  • $\begingroup$ @MarcoB yes, i want a "smoother" plot $\endgroup$ – Gonzalo Jul 3 '15 at 20:58
3
$\begingroup$

You can get a smoother result by taking the Log before making the interpolation:

loginterp[x_] = 
  Interpolation[{Log10[#1], #2} & @@@ Rest@#, InterpolationOrder -> 2][Log10[x]] & /@ 
    {FinosCA, FinosCB, FinosCC, FinosCM};

Show[
  LogLinearPlot[Evaluate@loginterp[x], {x, FinosCA[[2, 1]], FinosCA[[-1, 1]]}], 
  ListLogLinearPlot[{FinosCA, FinosCB, FinosCC, FinosCM}]
]

Mathematica graphics

Without taking the Log first, you'll get more spurious wiggles, even when using the "Spline" method:

interp[x_] = Interpolation[#, InterpolationOrder -> 2, Method -> "Spline"][x] & /@ 
  {FinosCA, FinosCB, FinosCC, FinosCM};

Show[
  LogLinearPlot[Evaluate@interp[x], {x, FinosCA[[2, 1]], FinosCA[[-1, 1]]}], 
  ListLogLinearPlot[{FinosCA, FinosCB, FinosCC, FinosCM}]
]

Mathematica graphics

$\endgroup$
3
$\begingroup$

You can add the options InterpolationOrder -> 2 and PlotRange -> {0.1, 110} to your ListLogLinearPlot. As all your data points start at 0, you have to remove these using Rest.

ListLogLinearPlot[{Rest@FinosCA, Rest@FinosCB, Rest@FinosCC, Rest@FinosCM}, 
 Joined -> True, AspectRatio -> 1/GoldenRatio, 
 AxesLabel -> {"Diamentro de malla\ndel tamiz [mm]", "% Pasante Acumulado"}, 
 LabelStyle -> Directive[FontSize -> 14], ImageSize -> 650, 
 PlotStyle -> {PSa, PSb, PSc, PSt}, InterpolationOrder -> 2, PlotRange -> {0.1, 110}]

Out

$\endgroup$
2
$\begingroup$

I propose to use the build-in interpolating function Interpolation which is a continuous function, and then to make sampling at higher frequency :

FinosCA = {{0, 0}, {0.15, 2}, {0.3, 10}, {0.6, 25}, {1.18, 50}, {2.36,
      80}, {4.75, 95}, {9.5, 100}};;

interpolatingFunction = Interpolation[FinosCA, InterpolationOrder -> 2];

n = 10; (* number of new points betwen initial points *)
newPointsAbcissa = 
  Flatten[Range[#[[1]], #[[2]], (#[[2]] - #[[1]])/(n + 1)] & /@ 
    Partition[First /@ FinosCA, 2, 1]];

Show[
 ListLogLinearPlot[
   Table[
        {x, interpolatingFunction[x]},
        {x,newPointsAbcissa}
        ]],
 ListLogLinearPlot[FinosCA, 
      PlotStyle -> {Red, PointSize[0.03], Point[FinosCA]}]
 ]

enter image description here

In red : the initial points.

EDIT

Of course, if you don't need the intermediate points, you can plot directly the continuous interpolating function. Here is the code :

{xmin, xmax} = {Min[#], Max[#]} & @ (First /@ Rest[FinosCA])
LogLinearPlot[interpolatingFunction[x], {x, xmin, xmax}]

enter image description here

Note : I have removed the first point of FinosCA (see code Rest[FinosCA] above) which is {0,0} and is -Infinity on a Log scale.

EDIT

The cusp is removed if you use the option Method -> "Spline" :

interpolatingFunction = 
  Interpolation[FinosCA, InterpolationOrder -> 2, Method -> "Spline"];

enter image description here

$\endgroup$
  • $\begingroup$ Once you have interpolatingFunction why not directly call LogLinearPlot? $\endgroup$ – Rahul Jul 3 '15 at 21:01
  • $\begingroup$ @Rahul : you could, of course, but I think that this presentation is more in the spirit of the question : one can see here how to re-sample (one say up-sample ?) irregular data. $\endgroup$ – andre314 Jul 3 '15 at 21:06
  • $\begingroup$ @Rahul I have added the LogLinearPlot solution $\endgroup$ – andre314 Jul 3 '15 at 21:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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