Skip to main content

plotting - How can I get the interpolation line from Listplot?


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?



Answer



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


Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...