# How do you change variables in a function without re-evaluating for plotting?

I have a function $$f(x)$$ that takes some time to evaluate. It's straightforward to plot but I'd also like to plot it as a function of y where, let's say, $$y=\sin(x)$$.

When I try Plot[f[Sin[x]],{Sin[x],lowlim,hilim}] Mathematica re-evaluates the function with the argument $$\sin(x)$$, which takes a while and doesn't give the right answer anyway. (The limits are right at least!)

Other things I've tried: With[{y=Sin[x]},Plot[f[y],{y,lolim,hilim}]] but I get the Tag Protected error. The slash dot rule /.y->Sin[x] yielded nothing. I also tried Block[{y=Sin[x]},Plot[f[y],{etc}]] and I get the raw object can't be used as an iterator error.

I'm sure the solution must be really simple but I just haven't found it myself yet. Essentially, I just want to scale the dependent variable axis without re-evaluating the function.

• The simplest way is making a list of values of the function first (using Table for example) and, further, plot it by ListPlot. So, you can re-run the plotting routing for some correction of the curve view without re-evaluation of the function. Aug 28, 2020 at 10:00
• Plot[f[Sin[x]],{x,xLowlim,xHilim}]. You need to set the limits for x since this is what you are integrating over. Aug 28, 2020 at 12:14
• Of course in your case the x limits won't be unique, i guess {x, ArcSin[lowlim], ArcSin[hilim]} gives you an idea of the problem... Aug 28, 2020 at 12:20
• 1) Tabulate f[x], 2) Interpolate the data fi[x], 3) plot fi[sin[x]]. Aug 28, 2020 at 13:43
• @Rom38 @ yarchik Yes, I was resisting making a table of values and working with that because I like that generally Mathematica doesn't make you deal with discrete values. But none of the other suggestions work so far - the original function is always re-evaluated and yields the wrong answer. So it looks like tabulating is the way to go this time. Aug 31, 2020 at 6:10

It is OK or not?

 f[x_] := x^2;
Plot[f[x], {x, -.5, .5}]
Plot[f[Sin[x]], Element[x, ImplicitRegion[-.5 <= Sin[x] <= .5, x]]]


• Plot[{f[x], f[Sin[x]]}, {x, -Pi, Pi}, PlotRange -> {0, 1}, PlotLegends -> "Expressions"] Aug 28, 2020 at 17:21

I found a slightly ugly solution, and perhaps someone can suggest a more elegant way!

Instead of writing $$f(x)$$ as a function f[x], I wrote it as a variable f then assigned a new function g[x]=f. Then I plotted Plot[g[x=ArcSin[y]],{y,ylolim,yhilim}]

What that works and Plot[f[x=ArcSin[y]],... does not isn't totally clear to me, but I think it's because f[x] is not being recalculated.