# [R] function curve() swap axes

David Winsemius dwinsemius at comcast.net
Thu Jul 5 17:09:12 CEST 2012

```On Jul 5, 2012, at 8:34 AM, Boudewijn Verkooijen wrote:

> Dear all,
>
> I'm using the curve() function to plot discharge Q against water
> depth a.
> However, I would like to have a graph of water depth a plotted against
> discharge Q. How can this be done?
> Minimal working example:
> S0 = 0.004
> n = 0.04
> tanalpha = 1.4/1.5
> par(mar = c(5,5,1,1)) # b, l, t, r
> curve((sqrt(S0)/n)*(0.035+(0.7+(x-0.1)/
> tanalpha)*(x-0.1))*((0.035+(0.7+(x-0.1)/tanalpha)*(x-0.1))/
> (2*sqrt((0.7/2)^2+0.1^2)+2*sqrt((x-0.1)^2+((x-0.1)/
> tanalpha)^2)))^(2/3),0.1,1.55,
> lwd = 3, col = "royalblue4", ann = F, axes = T)
> title(xlab = parse(text='a~bgroup("[", m, "]")'))
> title(ylab = parse(text='Q~bgroup("[", m^3/s, "]")'))
> box()
> I tried to find the inverse function, but that doesn't seem to exist.

R does not perform computer algebra. If you wanted a numerical
approach, you can construct a close fit to that function with
approxfun() and then reverse the x and y roles to create an inverse.
Actually, since curve returns a list with x and y components you could
also do this:

xycurv <- curve((sqrt(S0)/n)*(0.035+(0.7+(x-0.1)/
tanalpha)*(x-0.1))*((0.035+(0.7+(x-0.1)/tanalpha)*(x-0.1))/
(2*sqrt((0.7/2)^2+0.1^2)+2*sqrt((x-0.1)^2+((x-0.1)/
tanalpha)^2)))^(2/3),0.1,1.55,
+ lwd = 3, col = "royalblue4", ann = F, axes = T)

plot(xycurv\$y, xycurv\$x)

--

David Winsemius, MD
West Hartford, CT

```