7
$\begingroup$

My discrete data is:

data={{1., 5827.}, {3., 6242.}, {15., 6066.}, {60., 5972.}}

I want to get the interpolation line from ListPlot:

pl=ListPlot[data, Joined -> True,InterpolationOrder -> 2, PlotStyle -> Dashed, PlotRange -> {5900, 6300}]

enter image description here

But I can't get the same dash line from InterPolation:

Plot[Interpolation[data, InterpolationOrder -> 2][x], {x, 1, 60}, 
     PlotStyle -> Dashed]

enter image description here

How can I get the curve like 1st one?

Or can I get the dash line points automatically?

$\endgroup$
9
  • 1
    $\begingroup$ "Or can I get the dash line points automatically?" Yes you can, Cases[pl, Line[pts_] :> pts, Infinity] gives them. And you could use these points to make the interpolation function if you choose $\endgroup$
    – Jason B.
    May 10, 2016 at 10:29
  • 1
    $\begingroup$ Interesting, I didn't know InterpolationOrder in ListPlot can be a non-integer! $\endgroup$
    – xzczd
    May 10, 2016 at 10:41
  • $\begingroup$ @xzczd, it seems to be rounding down in this case tho; compare with the result of setting InterpolationOrder -> 2. $\endgroup$ May 10, 2016 at 10:42
  • $\begingroup$ This question is relevant, but the accepted answer does not seem to be correct in this case $\endgroup$
    – Jason B.
    May 10, 2016 at 10:46
  • 1
    $\begingroup$ @xzczd - If you add the option Method -> "Spline" to the accepted answer it gets you very close to the right plot, but blatantly different. I've noticed before that ListContourPlot uses a different interpolation than would come from just using Interpolation. user21 could probably shed some light on the matter $\endgroup$
    – Jason B.
    May 10, 2016 at 10:52

1 Answer 1

7
$\begingroup$

More of an extended comment here, but it is clear that ListPlot must use a different interpolation function than is available via Interpolation. We can get a very close approximation by Janus's answer here and amending the Method option. The idea is that ListPlot performs an parametric interpolation on the x and y axes separately.

data = {{1., 5827.}, {3., 6242.}, {15., 6066.}, {60., 5972.}};
pl = ListPlot[data, Joined -> True, InterpolationOrder -> 2, 
   PlotStyle -> Dashed, PlotRange -> {All, {5900, 6300}}];
pl2 = With[{xyInterpolation = 
     Interpolation[#, InterpolationOrder -> 2, Method -> "Spline"] & /@
       Transpose[data]},
   ParametricPlot[Through[xyInterpolation[i]], {i, 1, Length[data]}, 
    AspectRatio -> 2/3, PlotStyle -> Red]];
Show[pl, pl2]

Mathematica graphics

But those curves only match up approximately.

To answer the last question,

"Or can I get the dash line points automatically?"

Yes you can,

Cases[pl, Line[pts_] :> pts, Infinity]
(* {{{1.20269, 5900.}, {1.23947, 5913.25}, {1.28811, 
   5930.77}, {1.33925, 5949.19}, {1.39288, 5968.5}, {1.44901, 
   5988.72}, {1.50763, 6009.83}, {1.56874, 6031.84}, {1.63235, 
   6054.75}, {1.70031, 6077.42}, {1.77448, 6098.71}, {1.85486, 
   6118.63}, {1.94144, 6137.16}, {2.03423, 6154.32}, {2.13322, 
   6170.11}, {2.23843, 6184.51}, {2.34984, 6197.54}, {2.46746, 
   6209.18}, {2.59128, 6219.45}, {2.72131, 6228.35}, {2.85755, 
   6235.86}, {3., 6242.}, {3.14865, 6246.76}, {3.30352, 
   6250.14}, {3.46458, 6252.15}, {3.63186, 6252.77}, {3.80534, 
   6252.02}, {3.98503, 6249.89}, {4.17093, 6246.39}, {4.36304, 
   6241.5}, {4.56135, 6235.24}, {4.76587, 6227.6}, {4.97659, 
   6218.58}, {5.19353, 6208.19}, {5.41667, 6196.42}, {5.68221, 
   6184.14}, {6.02637, 6172.24}, {6.44912, 6160.71}, {6.95049, 
   6149.56}, {7.53046, 6138.78}, {8.18903, 6128.38}, {8.92621, 
   6118.34}, {9.74199, 6108.68}, {10.6364, 6099.4}, {11.6094, 
   6090.49}, {12.661, 6081.95}, {13.7912, 6073.79}, {15., 
   6066.}, {16.2874, 6058.58}, {17.6534, 6051.54}, {19.0981, 
   6044.87}, {20.6213, 6038.58}, {22.2231, 6032.66}, {23.9036, 
   6027.11}, {25.6626, 6021.94}, {27.5003, 6017.14}, {29.4166, 
   6012.71}, {31.4114, 6008.66}, {33.4849, 6004.98}, {35.637, 
   6001.68}, {37.8676, 5998.75}, {40.094, 5996.06}, {42.233, 
   5993.47}, {44.2847, 5990.99}, {46.2491, 5988.62}, {48.1262, 
   5986.35}, {49.916, 5984.19}, {51.6185, 5982.13}, {53.2337, 
   5980.18}, {54.7616, 5978.33}, {56.2021, 5976.59}, {57.5554, 
   5974.95}, {58.8214, 5973.42}, {60., 5972.}}} *)

 ListPlot@%

Mathematica graphics

$\endgroup$
1
  • $\begingroup$ It is a helpful method for me, than you. $\endgroup$
    – 400000000
    May 10, 2016 at 11:03

Your Answer

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

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