4
$\begingroup$

The answer given here solved how to use the same color scale across multiple plots within the function ListContourPlot. I can't for the life of me map this solution onto the function ContourPlot that I am using.

Say for example I have the code

r = Norm[{x, y}];
plot1 = Plot3D[{r^2, -r^2}, {x, -Pi, Pi}, {y, -Pi, Pi}, 
   ColorFunction -> "ThermometerColors", BoxRatios -> {2, 2, 3}];
plot2 = ContourPlot[r^2, {x, -Pi, Pi}, {y, -Pi, Pi}, 
   ColorFunction -> "ThermometerColors"];
GraphicsRow[{plot1, plot2}]

which gives me the plots. If you look at the code you will see that in the contour plot I am only plotting the positive solutions and so for consistency my plot should be contours that are shades of red.

How can I achieve this?

*****EDIT 1*****

kguler submitted an answer that solved this example question, but for a reason I can't understand it doesn't work in the actual system that I'm using. Here is my full code:

    Clear["Global`*"];
DynamicEvaluationTimeout -> Infinity;

(*Nearest neighbour vectors*)
{e1, e2, 
   e3} = # & /@ {{0, -1}, {Sqrt[3]/2, 1/2}, {-Sqrt[3]/2, 1/2}};

(*dispersion*)
w[theta_, phi_] := Module[{c1, c2, c3, fq},
  {c1, c2, c3} = 
   1 - 3 Sin[theta]^2 Cos[phi - 2 Pi (# - 1)/3]^2 & /@ {1, 2, 3};
  fq = Total[#[[1]] Exp[I q.#[[2]]] & /@ {{c1, e1}, {c2, e2}, {c3, 
       e3}}];
  Sqrt[1 + 2 # Omega Norm[fq]] & /@ {1, -1}
  ]



Omega = 0.01; 
q = {qx, qy};



(***Figure3a***)
{theta, phi} = {Pi/2, Pi/2};
dirac3a = {(2/Sqrt[3]) ArcCos[2/5], 4 Pi/3};
zoom = 0.005 Pi;

With[
 {plotopts = {Mesh -> None, PlotStyle -> Opacity[0.7], 
    Ticks -> {{1.33, 1.34, 1.35}, {4.18, 4.19, 4.20}, Automatic}, 
    BoxRatios -> {2, 2, 2}, PlotPoints -> 50, MaxRecursion -> 2, 
    AxesEdge -> {{-1, -1}, {1, -1}, {-1, -1}}, 
    ColorFunction -> "ThermometerColors", LabelStyle -> Large, 
    ClippingStyle -> None, BoxStyle -> Opacity[0.5], 
    ViewPoint -> {1.43, -2.84, 1.13}, ViewVertical -> {0., 0., 1.}}},
 figure3a = Plot3D[w[theta, phi],
   {qx, dirac3a[[1]] - zoom, dirac3a[[1]] + zoom}, {qy, 
    dirac3a[[2]] - zoom, dirac3a[[2]] + zoom}, plotopts]
 ]


(***Figure3b***)
With[{plotopts = {Frame -> True, 
    FrameTicks -> {{{4.18, 4.19, 4.20}, None}, {{1.33, 1.34, 1.35}, 
       None}}, ColorFunction -> "ThermometerColors", 
    LabelStyle -> Large, PlotRangePadding -> None, 
    ColorFunctionScaling -> False, 
    ColorFunction -> ColorData[{"ThermometerColors", {0.9996, 1.0004}}]
    }
  },
 figure3b = ContourPlot[w[theta, phi][[1]],
   {qx, dirac3a[[1]] - zoom, dirac3a[[1]] + zoom}, {qy, 
    dirac3a[[2]] - zoom, dirac3a[[2]] + zoom}, plotopts]
 ]

(***Figure3b legend***)

legend = {0.9996 + 0.0001 #, 0.9996 + 0.0001 #} & /@ {0, 1, 2, 3, 4, 
    5, 6, 7, 8};
figure3bLegend = 
 ArrayPlot[legend, ColorFunction -> "ThermometerColors", 
  DataRange -> {{0, 1}, {0.9996, 1.0004}}, 
  FrameTicks -> {{0.9996, 0.9997, 0.9998, 0.9999, {1.0000, "1.0000"}, 
     1.0001, 1.0002, 1.0003, 1.0004}, None}, AspectRatio -> 7, 
  LabelStyle -> Large]

where I have incorporated the suggestion, but it gives me a plot that is monochrome. The values 0.9996 and 1.0004 correspond to the maxima and minima.

What is going on here?

$\endgroup$
5
$\begingroup$
plot1 = Plot3D[{r^2, -r^2}, {x, -Pi, Pi}, {y, -Pi, Pi}, 
   ColorFunctionScaling -> False, 
   ColorFunction -> ColorData[{"ThermometerColors", {-20, 20}}], 
   BoxRatios -> {2, 2, 3}];
plot2 = ContourPlot[r^2, {x, -Pi, Pi}, {y, -Pi, Pi}, 
   ColorFunctionScaling -> False, 
   ColorFunction -> ColorData[{"ThermometerColors", {-20, 20}}]];

Legended[GraphicsRow[{plot1, plot2}], BarLegend[{"ThermometerColors", {-20, 20}}, 20]]

enter image description here

Update: For the specific example in OP's updated question, the following changes produce the desired result:

Change plotops appearing in the part generating figure3b to

plotopts = {Frame -> True, 
  FrameTicks -> {{{4.18, 4.19, 4.20}, None}, {{1.33, 1.34, 1.35}, 
     None}}, LabelStyle -> Large, ImageSize -> 400, 
  PlotRangePadding -> None, ColorFunctionScaling -> False, 
  ColorFunction -> ColorData[{"ThermometerColors", {0.9996, 1.0004}}]}

and use the same scaled colors in the ArrayPlot that generates the legend:

figure3bLegend = 
 ArrayPlot[legend, ColorFunctionScaling -> False, 
  ImageSize -> {200, 350}, 
  ColorFunction -> ColorData[{"ThermometerColors", {0.9996, 1.0004}}],
   DataRange -> {{0, 1}, {0.9996, 1.0004}}, 
  FrameTicks -> {{0.9996, 0.9997, 0.9998, 0.9999, {1.0000, "1.0000"}, 
     1.0001, 1.0002, 1.0003, 1.0004}, None}, AspectRatio -> 7, 
  LabelStyle -> Large]

and add the option ImageSize->400 in plotops used in generation of figure3a.

With these changes

Row[{figure3a, figure3b, figure3bLegend}, Spacer[5]]

gives enter image description here

$\endgroup$
  • $\begingroup$ I'm actually having a little trouble. I edited my question to reflect this $\endgroup$ – Tom Oct 29 '14 at 3:47
  • $\begingroup$ Tom, could you include in your post the values/definitions of w, theta, phi, dirac3a, zoom so that we can reproduce the issue? $\endgroup$ – kglr Oct 29 '14 at 4:04
  • $\begingroup$ Sorry yes that's more helpful, question updated. $\endgroup$ – Tom Oct 29 '14 at 9:45
  • $\begingroup$ Tom, you have ColorFunction appearing twice in your plotopts and the second one is ignored. If you remove the first one, i.e., plotopts = {Frame -> True, FrameTicks -> {{{4.18, 4.19, 4.20}, None}, {{1.33, 1.34, 1.35}, None}}, LabelStyle -> Large, PlotRangePadding -> None, ColorFunctionScaling -> False, ColorFunction -> ColorData[{"ThermometerColors", {0.9996, 1.0004}}]}, it should work. $\endgroup$ – kglr Oct 29 '14 at 12:08

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.