1
$\begingroup$

I am attempting to use the following set of code

Show[
 VectorPlot3D[
  {x (1 - x) - x*y, y (1 - y) + x*y - y*z, z (1 - z) + y*z},
  {x, 0, 1.2}, {y, 0, 1.2}, {z, 0, 1.2},
  Axes -> True,
  AxesLabel -> {"x", "y", "z"},
  VectorColorFunction -> "Rainbow",
  VectorPoints -> 5,
  VectorScale -> {0.03, .7, None},
  VectorStyle ->
   Graphics[
    {EdgeForm[Black], Rectangle[{-2, -.2}, {0, .2}], 
     Polygon[{{0, .5}, {Sqrt[3], 0}, {0, -.5}}]}
    ]
  ],
 Graphics3D[{
   PointSize[0.05],
   Point[{0, 0, 0}],
   EdgeForm[Black],
   FaceForm[Red]
   }]
 ]

In order to plot a three dimensional vector field (which looks exactly the way I want it to with no issues, so no problems with the first half) in order to get a phase space diagram for a system of ODEs.

Now, I'd also like to plot the equilibrium points of the system on the point, so I started with the origin. I would like the points to be red with a black outline, so they look sort of thematically consistent with the vectors in the plot (I also think an outline really helps to improve the readability on a 3D plot).

However, using EdgeForm and FaceForm isn't working for me, which according to the documentation is because they do not work for Point objects but instead for polygons.

So, my question is, is there a way to give the point a solid black outline? Or will I have to define the point in another way?

$\endgroup$
  • $\begingroup$ "will I have to define the point in another way?" - yes; use Disk[] with a "tiny" radius and then use EdgeForm[] to get your desired style. $\endgroup$ – J. M. will be back soon Mar 22 at 12:11
  • 1
    $\begingroup$ @J.M.isslightlypensive Looking at the Documentation, Graphics3D does not accept Disk[] as a primitive. How do I do this? Would you mind posting an answer showing how this would work? $\endgroup$ – jeanquilt Mar 22 at 12:28
  • $\begingroup$ Hmm, it looks like I missed the "3D" part of your question. Perhaps an approximation with CirclePoints[] could be done. The problem with this is figuring how to properly orient the flat disks so that they are directly facing you from the current ViewPoint setting. $\endgroup$ – J. M. will be back soon Mar 22 at 12:31
3
$\begingroup$

You can use Text with \[EmptyCircle] and \[FilledCircle]:

Show[VectorPlot3D[{x (1 - x) - x*y, y (1 - y) + x*y - y*z, 
   z (1 - z) + y*z}, {x, 0, 1.2}, {y, 0, 1.2}, {z, 0, 1.2}, 
  Axes -> True, AxesLabel -> {"x", "y", "z"}, 
  VectorColorFunction -> "Rainbow", VectorPoints -> 5, 
  VectorScale -> {0.03, .7, None}, 
  VectorStyle -> Graphics[{EdgeForm[Black], Rectangle[{-2, -.2}, {0, .2}], 
     Polygon[{{0, .5}, {Sqrt[3], 0}, {0, -.5}}]}]], 
 Graphics3D[{Text[Style["\[FilledCircle]",  Yellow, FontSize -> Scaled[.05]], {0, 0, 0}], 
  Text[Style["\[EmptyCircle]", Black, FontSize -> Scaled[.05]], {0, 0, 0}]}]]

enter image description here

Alternatively, you can use two Points with slightly different sizes:

Show[VectorPlot3D[{x (1 - x) - x*y, y (1 - y) + x*y - y*z, 
   z (1 - z) + y*z}, {x, 0, 1.2}, {y, 0, 1.2}, {z, 0, 1.2}, 
  Axes -> True, AxesLabel -> {"x", "y", "z"}, 
  VectorColorFunction -> "Rainbow", VectorPoints -> 5, 
  VectorScale -> {0.03, .7, None}, 
  VectorStyle -> Graphics[{EdgeForm[Black], Rectangle[{-2, -.2}, {0, .2}], 
     Polygon[{{0, .5}, {Sqrt[3], 0}, {0, -.5}}]}]], 
 Graphics3D[{PointSize[.05], Black, Point[{0, 0, 0}], 
   PointSize[.04], Yellow, Point[{0, 0, 0}]}]]

enter image description here

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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