Re: Plot function at specific points
- To: mathgroup at smc.vnet.net
- Subject: [mg114118] Re: Plot function at specific points
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Wed, 24 Nov 2010 06:58:49 -0500 (EST)
Istvan, Sure, yours is a possibility. I did not use ListPlot since I took it as you wanted to completely avoid it. I would probably not overload Plot but rather make my own myPlot that behaves like this: ClearAll[myPlot]; SetAttributes[myPlot, HoldAll]; myPlot[func_, {x_, range_}, opts:OptionsPattern[]] /; MatchQ[range, {__?NumericQ}] :== ListPlot[ Transpose@Outer[{#1, #2[#1]} &, range, If[ListQ@func, func, {func}]], opts, Joined -> True]; myPlot[args___]:==Plot[args] This seems safer - for functions as complex as Plot, you never know what yo= u can break by overloading them. Regards, Leonid 2010/11/23 Istv=E1n Zachar <replicatorzed at gmail.com> > This is indeed a cheater solution : ) > And a twofolded cheater, though rather clever: first, it is messy in the > sense that the eps threshold is something arbitrary, and second, it still > goes over the 10000 iterations - something that I definitely want to avoi= d > if I have a set of explicit query-points. > I'm sure that somehow the plotting algorithm can be instructed via the > Method option to sample at specific locations, though I still haven't fou= nd > any info about such possibilities. In the meantime I've crafted the > following workaround, following the v6 extension of Table to list iterato= rs: > > > f == Interpolation[{{0, 1}, {1, 2}, {2, 3}, {3, 5}, {4, 8}, {5, 5}, {6, 2= }, > {7, 1}, {8, 1}, {9, 2}, {10, 4}}]; > g == Interpolation[{{0, 3}, {1, 4}, {2, 5}, {3, 5}, {4, 5}, {5, 4}, {6, 3= }, > {7, 2}, {8, 1}, {9, 1}, {10, 0}}]; > > lowRes == Range[0, 10, 2]; > > Unprotect[Plot]; > Plot[func_, {x_, range_}, opts___] /; MatchQ[range, {__?NumericQ}] :== > ListPlot[ > Transpose@Outer[{#1, #2[#1]} &, range, If[ListQ@func, func, > {func}]], opts, Joined -> True]; > Protect[Plot]; > > Plot[{f, g}, {x, lowRes}] > Plot[g, {x, lowRes}] > > > I see no objection why this extension shouldn't be part of v9 in the futu= re > (or even of v8.0.1) : ) > Of course some proper option-handling must be added as well, and it must = be > extended to LogPlot and relatives, > but I think I'll use this until someone can reveal the scope of Method > inside Plot. > > Thanks again for the suggestions, > > Istvan > > > > > On 2010.11.23. 14:51, Leonid Shifrin wrote: > > Hi Istvan, > > You are likely to get much better solutions, but here is one way (cheatin= g > somewhat): > > f == Interpolation[{{0, 1}, {1, 2}, {2, 3}, {3, 5}, {4, 8}, {5, 5}, {6, > 2}, {7, 1}, {8, 1}, {9, 2}, {10, 4}}]; > lowRes == Range[0, 10, 2]; > eps == 0.001; > cutF == Function[ > Evaluate[ > Module[{x}, > Total[UnitStep[x - # + eps]*UnitStep[# + eps - x] & /@ > lowRes] /. x -> #]]]; > Plot[f[x]*cutF[x], {x, 0, 10}, PlotRange -> {{0, 10}, {0, 9}}, > PlotPoints -> 10000, PlotStyle -> {Thickness[0.005]}] > > If your f[x] is expensive to compute, you can define f[x]cutF[x] as a > single function and > compute f[x] lazily only when cutF[x] is non-zero. > > Regards, > Leonid > > > 2010/11/23 Istv=E1n Zachar <zac at freemail.hu> > >> Dear Group, >> >> is there a method to plot an InterpolatingFunction at specific pointr >> WITHIN Plot? I am of course aware that I can use ListPlot at any time, >> though for certain reasons I have to stick with Plot. The main reason >> is that I have a large amount of InterpolatingFunctions which I plot >> with Plot as default, though at request I have to plot the same >> InterpolatingFunctions at different resolutions. PlotPoints and >> MaxRecursion is no good here, since lower resolution has to use a >> certain set of x-values, defined prior to plotting. Obviously I want >> to use the same Plot setup for both high and low-resolution cases. >> Below is a toy modell of the problem: >> >> f == Interpolation[{{0, 1}, {1, 2}, {2, 3}, {3, 5}, {4, 8}, {5, 5}, {6, >> 2}, {7, 1}, {8, 1}, {9, 2}, {10, 4}}]; >> lowRes == Range[0, 10, 2]; >> Plot[f[x], {x, 0, 10}, PlotRange -> {{0, 10}, {0, 9}}] >> ListLinePlot[{#, f@#} & /@ lowRes, PlotRange -> {{0, 10}, {0, 9}}] >> >> Again, what I want is to have a specific Plot call instead of the >> ListLinePlot, but with same result as ListLinePlot. >> Note that values of 'lowRes' may not correspond the exact x- >> coordinates supplied to f. >> >> Is there a way to tell Plot explicitly the steps to use? Any idea? >> >> Istvan >> >> >