enter image description hereI'm trying to plot a system with a variable (or field) $\theta(x,t)\in[-\pi,\pi]$ which is an angle at every position $x$. The positional argument $x$ itself is a periodic coordinate $x\in[-\pi,\pi]$. I'm trying to show some topological properties of this field, and I felt that a natural way to do so would be to plot the curve $\theta$ versus $x$ for $\theta = \theta(x)$ at a fixed time $t$ on the surface of a torus ($S^1\times S^1$). This would clearly represent the periodic nature of $\theta$ and $x$. Is there a neat way to do this on Mathematica?

For example, my idea was to use the blue coordinate (refer image) as the position variable $x$ and the red coordinate at each $x$ to represent $\theta(x)$. In this way both $x$ and $\theta$ are periodic.

Edit: $t$ is time. I just put it there for completeness. I need to plot the variable at different time slices.

New contributor
zorn is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
  • Maybe the word 'field' is a bit misleading. I just need to plot a function which has a periodic domain and range. For example, if I have a function \theta(x)=x, and x and theta are periodic. I wanted to use the toroidal angle for the variable x and the poloidal angle for theta. – zorn Dec 7 at 4:32
  • (1) What's t in first line? How is that suppose to enter into the plot? (2) My take on your comment: You wish to plot a curve on the surface of $S^1 \times S^1$ that represents a function $S^1 \rightarrow S^1$ given by $\theta = f(x)$? – Michael E2 Dec 7 at 11:42
  • Example from your comment, $\theta = x$: With[{f = Function[x, x]}, ParametricPlot3D[{(2 + Cos[\[Theta]]) Cos[ x], (2 + Cos[\[Theta]]) Sin[x], Sin[\[Theta]]}, {x, -Pi, Pi}, {\[Theta], -Pi, Pi}, MeshFunctions -> {Function[{x0, y0, z0, x, \[Theta]}, \[Theta] - f[x]], #4 &, #5 &}, Mesh -> {{0}}, MeshStyle -> {Directive[Thick, ColorData[97][1]], Thin, Thin}, BoundaryStyle -> None]] -- the thick, bluish line represents the graph, the thin lines are the $\theta,x$ axes. Is that what you're after? – Michael E2 Dec 7 at 11:43
  • 1
    Thank you! This seems to be what I was looking for. However, when I tried slightly more general functions, the plot seems to be incomplete. For example \theta=2x seems to cutoff at some point, when it should wind around the torus twice. – zorn Dec 7 at 17:31
  • Thanks for the accept. I edited the question to try to clarify that the graph (curve) of $\theta(x)$ is what it being plotted on the torus. I do think the word "field" is misleading. To me it means a function that is defined at every point on the torus, either a scalar field or a (tangent) vector field. I left it in the question, but you might want to rephrase it. If I've messed up, feel free to roll back the edit. – Michael E2 Dec 8 at 11:44
up vote 2 down vote accepted

Ignoring $t$, which might seem irrelevant after some of the comments, one can plot $\theta = \theta(x)$ for $(x,\theta)\in S^1\times S^1$ with ParametricPlot3D. One issue is that some aspects of plotting functions do not automatically deal very well with discontinuities, such as MeshFunctions. To make x periodic over $[\pi, \pi]$, one might use Mod[#, 2 Pi, -Pi] &, but it creates discontinuities that cause spurious mesh lines along the discontinuities. Instead, consider the homeomorphism $S^1 \cong{\Bbb R}/(2\pi{\Bbb Z})$. If $x,\theta \in S^1$, then we can use the subgroup $2\pi{\Bbb Z}$ for the Mesh specification. However, a Mesh specification must be finite, so we need to know the bounds on $f(x)$ or otherwise specify a sufficiently broad range for Mesh.

With[{f = Function[x, 2 x]}, 
 ParametricPlot3D[{(2 + Cos[\[Theta]]) Cos[x], (2 + Cos[\[Theta]]) Sin[x], Sin[\[Theta]]},
  {x, -Pi, Pi}, {\[Theta], -Pi, Pi},
  MeshFunctions -> {Function[{x0, y0, z0, x, \[Theta]}, \[Theta] - f[x]], #4 &, #5 &},
  Mesh -> {2 Pi*Range[-10, 10], {0}, {0}}, 
  MeshStyle -> {Directive[Thick, ColorData[97][1]], Thin, Thin}, 
  BoundaryStyle -> None]]

enter image description here

What you probably need is: https://reference.wolfram.com/language/ref/SliceDensityPlot3D.html

and the equation(s) of a Torus is(are) given by: http://mathworld.wolfram.com/Torus.html

Assuming that you want to work with (u as x) and (v as t), I guess you should try something like this:

\[Theta][u_, v_] := u + v;

c = 1; a = 4;
x = (c + a*Cos[v]) Cos[u];
y = (c + a*Cos[v]) Sin[u];
z = a*Sin[v];

SliceDensityPlot3D[\[Theta][u, 
  v], {(c - Sqrt[x^2 + y^2])^2 + z^2 == a^2}, {u, 0, 2 \[Pi]}, {v, 0, 
  2 \[Pi]}]
  • This seems unlikely to be a convenient approach, since SliceDensityPlot[] plots in rectangular (x,y,z) coordinates and the field is given in circular/angular coordinates. Not sure why it was upvoted. Besides which the OP indicates three parameters $\theta,x,t$ to be plotted on a 2D surface generated by $\theta$ and $x$, the role of $t$ being unspecified. It's unclear what's being asked, so it's unclear how this is an answer. Again, not sure why it was upvoted. – Michael E2 Dec 7 at 3:42
  • I agree with you about the issue with 't' whose role is not being clearly specified by the OP but I disagree with you about the coordinates: Transforming angular coordinates into rectangular is not a problem at all (the second link I posted gives you an example). – JuanC97 Dec 7 at 15:06
  • I'm interpreting OP's question as follows: He wants to use the (Azimuthal angle to represent x) and (The other angle to represent t), hence, he'll be able to plot theta(x,t) on a Torus using SliceDensityPlot[]. – JuanC97 Dec 7 at 15:09
  • Well, that was close my original interpretation, too, although I thought the OP made it clear that the coordinates of the torus were to be $x$ and $\theta$, not $t$.; however, it didn't seem like the OP thought the code I posted solved the problem. -- As for convenience, one would have to get angular coordinates in terms of rectangular coordinates, which is not explained in the MathWorld page or in the answer. By inconvenient, I didn't mean unsolvable, though. – Michael E2 Dec 7 at 15:31
  • 1
    Okay, I just wrote the above, when you posted the new code. What does your output look like? I get this: i.stack.imgur.com/UE9ei.png -- Is there a typo in the posted code? – Michael E2 Dec 7 at 15:32

Your Answer

zorn is a new contributor. Be nice, and check out our Code of Conduct.

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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