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?
Answer
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]]
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
Comments
Post a Comment