24
$\begingroup$

Mathematica can use ContourPlot to draw implicit Cartesian equations, but doesn't seem to have a similar function to plot an implicit polar equation, for example

$\theta ^2=\left(\frac{3 \pi }{4}\right)^2 \cos (r)$

What's the best way to do this?

$\endgroup$
5
  • $\begingroup$ Well, it's a good question and I see solutions people are coming up with are different. Always interesting to see and compare, no harm in it. $\endgroup$ Commented Jan 23, 2012 at 20:39
  • $\begingroup$ @David can I ask why you removed the "storytelling paragraph"? I only wanted to let people know that I planned to answer myself, and would have deleted it myself later. $\endgroup$ Commented Jan 23, 2012 at 20:56
  • $\begingroup$ We don't want to discourage people from answering questions. Even if you have one solution, there might be others that are enlightening for yourself or others. $\endgroup$ Commented Jan 23, 2012 at 21:01
  • $\begingroup$ Makes sense, I just didn't want to make others spend their time repeating a solution I already have written out. Nevermind, as you said, all contributions are helpful. $\endgroup$ Commented Jan 23, 2012 at 21:09
  • $\begingroup$ Related: mathematica.stackexchange.com/q/67261/1871 $\endgroup$
    – xzczd
    Commented Mar 9, 2019 at 6:22

7 Answers 7

28
$\begingroup$

Since ContourPlot[] returns a GraphicsComplex, you could also replace the point list of the plot with g @@@ pointlist where g is the coordinate transformation. For example

f[r_, th_] := th^2 - (3 Pi/4)^2 Cos[r]
g[r_, th_] := {r Cos[th], r Sin[th]} 

pl = ContourPlot[f[r, th] == 0, {r, 0, 8 Pi}, {th, 0, 2 Pi}, PlotPoints -> 30];
pl[[1, 1]] = g @@@ pl[[1, 1]];

Show[pl, PlotRange -> All]

which produces

Mathematica graphics

The advantage of this method is that it also works for coordinate transformations for which the inverse transformation is hard to find.

$\endgroup$
6
  • 1
    $\begingroup$ cheeky, cheeky... +1 $\endgroup$
    – acl
    Commented Jan 23, 2012 at 20:43
  • 4
    $\begingroup$ Very interesting point, applying the coordinate transformation to the finished plot. However, I think this might fail for high frequency functions/coordinate systems etc., since after plotting things like the step distance between points are already set. $\endgroup$
    – David
    Commented Jan 23, 2012 at 20:46
  • $\begingroup$ This is basically what I ended up doing, I turned it into a self-contained function so I'll post it up later. +1 for reading my mind. @David I did find that quality was reduced but bumping up MaxRecursions helps without slowing things down too much. $\endgroup$ Commented Jan 23, 2012 at 20:49
  • 1
    $\begingroup$ I would include AspectRatio -> Automatic in Show so that this "looks nice." $\endgroup$
    – Mr.Wizard
    Commented Jan 24, 2012 at 14:20
  • $\begingroup$ It doesn't work in version 13. It should be pl[[1, 1, 1]] = g @@@ pl[[1, 1, 1]]; $\endgroup$
    – yode
    Commented Jan 3, 2022 at 19:21
13
$\begingroup$

Does this

ContourPlot[
 Evaluate@With[
   {r = Sqrt[x^2 + y^2],
    θ = ArcTan[x, y]},
   θ^2 - Cos[r] == 0
   ],
 {x, 0.1, 4 Pi}, {y, 0, 4 Pi}
 ]

work?

Plot:

Mathematica graphics

$\endgroup$
2
  • $\begingroup$ This is a great method, unfortunately it's not as useful if you want to specify the plotting range in polar, rather than cartesian, coordinates. +1 for your ContourPlot substitution, this is something I tried originally but couldn't get to work. $\endgroup$ Commented Jan 23, 2012 at 21:17
  • $\begingroup$ @myk thanks, Heike's is definitely cleverer and also more useful if you can't invert the transformation easily $\endgroup$
    – acl
    Commented Jan 23, 2012 at 21:20
10
$\begingroup$

If you allow negative radii, there's another entire half of the solution:

PolarPlot[
   Evaluate[Flatten[
      Table[{-ArcCos[(16 t^2)/(9 Pi^2)], ArcCos[(16 t^2)/(9 Pi^2)]} + k 2 Pi, 
            {k, -2, 2}]
      ]], 
   {t, -Pi, Pi}, 
   PlotStyle -> Table[Directive[Thick, Hue[i/10]], {i, 10}]
   ]

enter image description here

$\endgroup$
9
$\begingroup$

You can do something like this:

ContourPlot[ArcTan[x,y]^2 == (3 Pi/4)^2 Cos[Sqrt[x^2 + y^2]], 
{x, -23, 23}, {y, -23, 23}, ContourStyle -> Directive[Thick, Orange]]

enter image description here

$\endgroup$
2
  • $\begingroup$ I think you're still missing a square on the 3Pi/4. $\endgroup$ Commented Jan 23, 2012 at 21:21
  • $\begingroup$ @BrettChampion Yes, thanks, have to get my math straight ;-) $\endgroup$ Commented Jan 24, 2012 at 2:15
8
$\begingroup$

All the other three solutions use ContourPlot. Here's a solution using PolarPlot.

PolarPlot[{ArcCos[#2^2/(3 π/4)^2] + 2 π #1, 
    -ArcCos[#2^2/(3 π/4)^2] + 2 π (#1 + 1)} & @@ QuotientRemainder[Abs@ θ, 2 π], 
    {θ, -7 π, 8 π}, PlotStyle -> {Thick, Darker@Green}]

enter image description here

This makes use of the fact that the solution to $\theta^2=\displaystyle\left(\frac{3\pi}{4}\right)^2\cos(r)$ is

$$r=\pm\arccos\left(\frac{16\theta^2}{9\pi^2}\right)+2\pi n,\ n\in\mathbb{Z}$$

$\endgroup$
0
1
$\begingroup$

My question seems a duplicate of this one. And cvgmt's answer works as well.

ContourPlot[\[Theta]^2 == ((3 \[Pi])/4)^2 Cos[r], {r, -20, 
20}, {\[Theta], -\[Pi], \[Pi]}, PlotPoints -> 100, PlotRange -> All,
AspectRatio -> Automatic, DisplayFunction -> 
ReplaceAll[{r_Real, \[Theta]_Real} :> {r*Cos[\[Theta]], r*Sin[\[Theta]]}]]

enter image description here

$\endgroup$
0
$\begingroup$

My answer to metroidman's question contains two solutions that work. The first is essential the same as @Heike's answer here, which I had missed earlier and upvoted now, and very similar to the answer @metroidman posted. My second solution using the polarEquationPlot[] package adaptively refines the curves in the geometry of the $xy$ plane instead of in the $\theta r$ plane (see my answer).

Get["https://raw.githubusercontent.com/mroge02/polarEquationPlot/main/polarEquationPlot.wl"]

polarEquationPlot[\[Theta]^2 == ((3  \[Pi])/4)^2  Cos[
    r], {\[Theta], -2 \[Pi], 2 \[Pi]}, {r, -20, 20},
 PolarGridLines -> Automatic, GridLinesStyle -> Thin]
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.