4

I am trying to fill in the area between curves in a parametric plot. I have:

ffA[x_, n_] := MathieuCharacteristicA[n, x]; 
ffB[x_, n_] := MathieuCharacteristicB[n, x];

MathieuPlot =ParametricPlot[{{ffA[x, 1], x}, {ffB[x, 1], x}, {ffA[x, 2], x}, 
{ffB[x, 2], x}, {ffA[x, 3], x}, {ffB[x, 3], x}, {ffA[x, 4], x}, {ffB[x, 4], x}}, 
{x, 0, 10}, AspectRatio -> 1, PlotRange -> {{0, 20}, All}, 
PlotStyle -> Black, Ticks -> None]

enter image description here

I saw the solutions to these questions: 1, 2,3. However, Filling only works for Plot, and solutions 1/2 don't fill in the area between the curves. According to this question, I can shade the area between curves with:

coords = Cases[Normal[MathieuPlot], {dir___, Line[x_]} :> x, Infinity];
Graphics[{{{{{Red, Thick, Line@#, Blue, Line@#2, LightBlue, 
        Polygon[Join[#, Reverse@#2]]} & @@ 
      coords}, {Red, Thick, Line@#3, Blue, Line@#4, LightBlue, 
       Polygon[Join[#3, Reverse@#4]]} & @@ 
     coords}, {Red, Thick, Line@#5, Blue, Line@#6, LightBlue, 
      Polygon[Join[#5, Reverse@#6]]} & @@ 
    coords}, {Red, Thick, Line@#7, Blue, Line@#8, LightBlue, 
     Polygon[Join[#7, Reverse@#8]]} & @@ coords}, 
 AspectRatio -> 1/GoldenRatio, Ticks -> {True, {2, 4, 6, 8, 10}}, 
 Frame -> True]

enter image description here

However, I'm not sure how to only plot the curves to the right of zero. I suspect that it has something to do with how coords is defined, but I am not sure how to modify it. I am also unsure how to make the plots touch the horizontal and vertical axes, similar to the top picture.

user85503
  • 992
  • 1
  • 9
  • 22

1 Answers1

11

Update: You can use a single ParametricPlot with the options MeshFunctions and Mesh to get the same result:

ParametricPlot[Evaluate[{ffA[x, #] v + (1 - v) ffB[x, #], x} & /@ Range[4]], 
 {x, -10, 10}, {v, 0, 1}, 
 PlotRange -> All, 
 PlotRangePadding -> None, 
 BoundaryStyle -> None, 
 Frame -> False, 
 Ticks -> False, 
 MeshFunctions -> {#4 &}, 
 Mesh -> {{0, 1}}, 
 MeshStyle -> Opacity[1, Black], 
 AspectRatio -> 1]

enter image description here

Original answer:

You can use a two-parameter ParametricPlot and combine the output with your MathieuPlot using Show:

Show[MathieuPlot, 
 ParametricPlot[Evaluate[{ffA[x, #] v + (1 - v) ffB[x, #], x} & /@ Range[4]],
   {x, 0, 10}, {v, 0, 1}, BoundaryStyle -> None]]

enter image description here

Use PlotRange -> All and PlotRangePadding -> None in the first plot and {x, -10, 10} in both plots to get

enter image description here

kglr
  • 394,356
  • 18
  • 477
  • 896
  • This is exactly what I was wondering! Thanks!

    Do you know if there is a way for the vertical axis to end at the same height as the plot?

    – user85503 Dec 25 '19 at 00:09
  • 1
    @user85503, try PlotRangePadding->None (in Show or in ParametricPlot that generates MathieuPlot.) – kglr Dec 25 '19 at 00:17