Skip to main content

plotting - Scale coloring of ContourPlot


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]]

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



Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...