2
$\begingroup$

I am trying to overlay a contour plot I have created on a ListPlot3D graph. I have seen a few questions answered on this website that answer my basic question. However, the contour plot I need to use cannot be simply applied to a table, so the ListInterpolation function is not of use to me. Is there a way to get around this problem? Right now, I have used a method provided in this question, Using a ListDensityPlot to map color onto a ListPlot3D graph (using an image rather than the actual function to graph) but the resulting graphic (cp5) is slighly blurry, not oriented correctly, and not to the perfect size (see the function below).

ListPlot3D[gs5Matrix5, TextureCoordinateFunction -> ({#1, #2} &), 
 PlotStyle -> Texture[cp5], PlotRange -> All, 
 BoxRatios -> {1, 1, 1/2}, Mesh -> None, ImagePadding -> None]

In addition, gs5Matrix gives an array of coordinates (i.e. {{1,2,3}, {4,5,6}, {..}...}. I found this to be the easiest way to represent the points seeing as the second coordinate spacing (which has to do with unevenly spaced cosine values) makes it difficult to show in a table.

The contour function is as follows:

potentialM5[r_, θ_] :=
 Module[{x, n, ϵ, V},
  x = r/Rm5[θ, κ] /. m5values;
  n = m5[θ, ξ] + γ*(x - 1) /. m5values;
  ϵ = ϵ0 + dϵ1*f[θ, λ] + dϵ2*g[θ] /. m5values;
  V = ϵ/(n - 6)*(6*x^-n - n*x^-6);
  V
  ]

cp5 = ContourPlot[
  potentialM5[r, θ], {θ, 0, 180}, {r, 3, 6}, 
  Contours -> contours]

Rm5[θ_, v_] = Rm0 + dR1*f[θ, v] + dR2*g[θ];
g[θ_] = If[θ >= 90, Cos[(θ*π)/180]^2, 0];
m5[θ_, v_] = m0 + dm*f[θ, v];
m5values = {ϵ0 -> 180.51, dϵ1 -> -79.35, 
dϵ2 -> 34.0, λ -> 4.04, Rm0 -> 4.0093, 
dR1 -> -.1234, dR2 -> -.160, κ -> 12.11, m0 -> 22.39, 
dm -> -9.93, ξ -> 17.25, γ -> 9.0};
f[θ_, v_] = 1 - (1/2 (1 + Cos[(θ*π)/180]))^v;

Any help would be greatly appreciated.

Update: Since my g5Matrix5 is too challenging to define here, I have devised a simpler example whose answer should provide me with an answer to my own question. Below are the equations for both the contour plot as well as the ListPlot3D.

 ContourPlot[Sin[x]^2 + 2 y, {x, 0, 2 π}, {y, 0, 4}];

values = {{0, 0, 0.2`}, {0, 1, 0.3`}, {0, 3.5`, 0.43`}, {0, 4, 0.2`},
   {(2 π)/3, 0, 0.38`}, {(2 π)/3, 1, 0.45`}, {(2 π)/3, 3.5`, 0.25`},
   {(2 π)/3, 4, 0.1`}, {(4 π)/3, 0, 0.37`}, {(4 π)/3, 1, 0.4`},
   {(4 π)/3, 3.5`, 0.5`}, {(4 π)/3, 4, 0.2`}, {2 π, 0, 0.2`},
   {2 π, 1, 0.5`}, {2 π, 3.5`, 0.35`}, {2 π, 4, 0.22`}};

As you can see, the y-values are spaced unevenly

$\endgroup$

closed as off-topic by Michael E2, MarcoB, user9660, Yves Klett, dr.blochwave Dec 9 '15 at 11:05

  • The question does not concern the technical computing software Mathematica by Wolfram Research. Please see the help center to find out about the topics that can be asked here.
If this question can be reworded to fit the rules in the help center, please edit the question.

  • $\begingroup$ A self-contained working example would increase the likelihood of a good answer. And welcome to Mathematica Stack Exchange. :-) $\endgroup$ – Mr.Wizard Jan 14 '15 at 16:32
  • $\begingroup$ Thanks for letting me know! I have added some information about the functions I am using in my original post. Please let me know if there's anything else that can provide clarity. $\endgroup$ – user24717 Jan 14 '15 at 18:40
  • 1
    $\begingroup$ I formatted your code. However this still isn't a self-contained example as we do not have definitions for Rm5, m5values, etc. Is this simplest code that can be used to illustrate your situation? $\endgroup$ – Mr.Wizard Jan 14 '15 at 18:44
  • $\begingroup$ The remaining variables should be defined below: m5values = {[Epsilon]0 -> 180.51, d[Epsilon]1 -> -79.35, d[Epsilon]2 -> 34.0, [Lambda] -> 4.04, Rm0 -> 4.0093, dR1 -> -.1234, dR2 -> -.160, [Kappa] -> 12.11, m0 -> 22.39, dm -> -9.93, [Xi] -> 17.25, [Gamma] -> 9.0}; Rm5[[Theta]_, v_] = Rm0 + dR1*f[[Theta], v] + dR2*g[[Theta]]; g[[Theta]_] = If[[Theta] >= 90, Cos[([Theta]*[Pi])/180]^2, 0]; m5[[Theta]_, v_] = m0 + dm*f[[Theta], v]; f[[Theta]_, v_] = 1 - (1/2 (1 + Cos[([Theta]*[Pi])/180]))^v; $\endgroup$ – user24717 Jan 14 '15 at 19:33
  • 4
    $\begingroup$ I'm voting to close this question as off-topic because no one is interested: the question and none of the answers are upvoted, the OP has not visited the site in 10 months -- obviously too localized. $\endgroup$ – Michael E2 Dec 9 '15 at 1:41
3
$\begingroup$

You can strip the frame and padding from the contour plot and the OP's approach seems to work.

cp5 = ContourPlot[Sin[x]^2 + 2 y, {x, 0, 2 π}, {y, 0, 4}];

values = {{0, 0, 0.2`}, {0, 1, 0.3`}, {0, 3.5`, 0.43`}, {0, 4, 0.2`},
   {(2 π)/3, 0, 0.38`}, {(2 π)/3, 1, 0.45`}, {(2 π)/3, 3.5`, 0.25`},
   {(2 π)/3, 4, 0.1`}, {(4 π)/3, 0, 0.37`}, {(4 π)/3, 1, 0.4`},
   {(4 π)/3, 3.5`, 0.5`}, {(4 π)/3, 4, 0.2`}, {2 π, 0, 0.2`},
   {2 π, 1, 0.5`}, {2 π, 3.5`, 0.35`}, {2 π, 4, 0.22`}};

lpcp5 = ListPlot3D[values, TextureCoordinateFunction -> ({#1, #2} &),
  PlotStyle -> 
   Texture[Show[cp5, Frame -> None, PlotRangePadding -> None, ImagePadding -> None]],
  PlotRange -> All, BoxRatios -> {1, 1, 1/2}, Mesh -> None, 
  ImagePadding -> None]

Mathematica graphics

GraphicsRow[{
  cp5, Show[lpcp5, ViewPoint -> {0, 0, Infinity}, ImagePadding -> {{15, 0}, {15, 0}}]}]

Mathematica graphics

$\endgroup$
2
$\begingroup$

I may have misunderstood but avoiding the overlays (and using values:

f[x_, y_] := Sin[x]^2 + 2 y
mx = Maximize[{f[x, y], 0 < x < 2 Pi, 0 < y < 4}, {x, y}]
mn = Minimize[{f[x, y], 0 < x < 2 Pi, 0 < y < 4}, {x, y}]
cont = Range[0, 9, 1];
contc[col_] := ColorData[col][#/9] & /@ cont;
Manipulate[
 ListPlot3D[values, MeshFunctions -> {Sin[#1]^2 + 2 #2 &}, 
  Mesh -> {cont}, MeshShading -> contc[color]], {color, 
  ColorData["Gradients"]}]

enter image description here

$\endgroup$
1
$\begingroup$

I drew a contour plot by defining Contours as 5,If it looks something like what your are expecting we may be on the right track.However I can't do the List Plot because gs5Matrix5 is not defined.

Rm5[θ_, v_] = Rm0 + dR1*f[θ, v] + dR2*g[θ];

g[θ_] = If[θ >= 90, Cos[(θ*π)/180]^2, 0];
m5[θ_, v_] = m0 + dm*f[θ, v];
m5values = {ϵ0 -> 180.51, dϵ1 -> -79.35, 
   dϵ2 -> 34.0, λ -> 4.04, Rm0 -> 4.0093, 
   dR1 -> -.1234, dR2 -> -.160, κ -> 12.11, m0 -> 22.39, 
   dm -> -9.93, ξ -> 17.25, γ -> 9.0};
f[θ_, v_] = 1 - (1/2 (1 + Cos[(θ*π)/180]))^v;

potentialM5[r_, θ_] := 
 Module[{x, n, ϵ, V}, 
  x = r/Rm5[θ, κ] /. m5values;
  n = m5[θ, ξ] + γ*(x - 1) /. m5values;
  ϵ = ϵ0 + dϵ1*f[θ, λ] + 
     dϵ2*g[θ] /. m5values;
  V = ϵ/(n - 6)*(6*x^-n - n*x^-6);
  V]

cp5 = ContourPlot[
  potentialM5[r, θ], {θ, 0, 180}, {r, 3, 6}, 
  Contours -> 5]
$\endgroup$
  • $\begingroup$ This helps me with plotting the countour, but I did have this portion of my problem solved. I am looking for a way to map this contour on top of the ListPlot3D. I have updated my initial question with a simplified answer that has values for the ListPlot3D as well as the contour. Thanks! $\endgroup$ – user24717 Jan 15 '15 at 18:10
1
$\begingroup$

Try this:

ListPlot3D[values, MeshFunctions -> {Function[{x, y, z}, Sin[x]^2 + 2 y]}]

This produces a pretty low-quality output for the given example, but the more points you have in the ListPlot the more points are used in calculating the contours for the mesh.

For example:

 ListPlot3D[
  Join @@ Table[{x, y, Abs[Sin[x + I y]]}, {x, -Pi, +Pi, 
     Pi/20.}, {y, -1, +1, 0.05}], 
  MeshFunctions -> {Function[{x, y, z}, Arg[Sin[x + I y]]]}, 
  BoxRatios -> Automatic]

(Plotting the absolute value of the complex Sin function, and overlaying contours of the complex argument.)

$\endgroup$
  • $\begingroup$ I just noticed that you specified the contour values with Contours -> contours, in this case you can use Mesh -> {contours}. $\endgroup$ – 2012rcampion Jan 28 '15 at 2:48

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