6
$\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$
  • 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 '16 at 10:29
  • 1
    $\begingroup$ Interesting, I didn't know InterpolationOrder in ListPlot can be a non-integer! $\endgroup$ – xzczd May 10 '16 at 10:41
  • $\begingroup$ @xzczd, it seems to be rounding down in this case tho; compare with the result of setting InterpolationOrder -> 2. $\endgroup$ – J. M.'s technical difficulties May 10 '16 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 '16 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 '16 at 10:52
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$
  • $\begingroup$ It is a helpful method for me, than you. $\endgroup$ – 400000000 May 10 '16 at 11:03

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.