# ContourPlot - unequal contour spacing

how can i specify the contour spacing or how the color range is distributed amongst the function values?

Let's say i plot some function depending on x and y. Function values differ between [0, 1]. I want that mathematica makes ...let's say 10 contours for the function value range [0,0.9] and another 10 contours for the rest of the range [0.9,1]. Further more the last Contour of the [0,0.9] range is supposed to be thicker, in order to show that from here on the contour spacing is finer.

thats alot so far for your help, my actual question has been answered already. but a follow-up question has arisen for me since the implementation of your codes does not work with my actual function and i don't know why. I have purged that function and the functions it calls from most variables and replaced them by constants for simplicity reasons. I hope it's ok so.

eislexpl[epsilon_, n2_, x_] :=  28 (epsilon)^2 - 1 +
((-2 Log[E^(1/2) x])/x^2 + (2.7(0.3 - epsilon))/x +
(10 epsilon^2 n2^(3/2))/x^(3/2));

eislminx2[epsilon_?NumericQ, n2_?NumericQ] :=
(minx = FindArgMin[{eislexpl[epsilon, n2, x], 0 < x}, x];
eislexpl[epsilon, n2, minx]);

ueislexpl[epsilon_, h_, n1_, n2_] :=
n1 (40  epsilon^2 - 1) + (1 -1.27 ) (1 + (n1 - 1) HeavisideTheta[1 - n1] -
(-1 + Exp[-(n1 - 1)]) HeavisideTheta[n1 - 1]) + n2  eislminx2[epsilon, n2] +
(h - n1 - n2) (28  epsilon^2 - 1);


ueislexpl[epsilon_, h_, n1_, n2_] is the function i want to plot with ContourPlot. If i use :

ContourPlot[
ueislexpl[0.1, 5, n1, n2], {n1, 0, 5}, {n2, 0, 5 - n1},
Contours -> (Function[{min, max},
Module[{r1, r2},
Join[r1 = Range[min, .1 max, (.1 max - min)/10],
r2 = Range[.1 max + .01, max, (max - .1 max - .01)/10]]]]),
ContourStyle -> (Join @@ {Table[Thick, {Length@r1}],
Table[Thin, {Length@r2}]})]


It should plot a contourplot with 10 divisions for the value range [min,0.1 max] and 10 more divisions for [0.1 max, max]. But my result is 3 divisions.

What do i have to change?

• In the future, try to include examples of your specific data and a minimum working instance of the code you have been working on. A questions that shows effort will give you reputation and its more likely to be answered soon and thoroughly. Aug 8, 2014 at 13:22
• Notice that max->-3.4 and therefore 0.1 max > max, you are placing the Contours out of the range, at this positions: {-4.39953,-3.99363,-3.58774,-3.18184,-2.77595,-2.37005,-1.96416,-1.55826,-1.15237,-0.746472,-0.340577,-0.330577,-0.638096,-0.945615,-1.25313,-1.56065,-1.86817,-2.17569,-2.48321,-2.79073,-3.09825,-3.40577} Aug 9, 2014 at 12:12
• ahhhh, you are right :) thanks Aug 9, 2014 at 12:45

Something like this?

ContourPlot[
1 - Exp[-x - y]
, {x, 0, 2}
, {y, 0, 2}
, PlotRange -> {0, 1}
, Contours -> Join[Range[0, 0.9, 0.1], Range[0.9, 1, 1/100]]
, ContourStyle -> Join[Table[Thick, {10}], Table[Thin, {9}]]
]


EDIT:

About the follow-up question, the function should look like this:

ContourPlot[
ueislexpl[0.1, 5, n1, n2]
, {n1, 0, 5}
, {n2, 0, 5 - n1}
, PlotPoints -> 100
, Contours -> (
Function[{min, max},
Module[{r1, r2, ret},
ret = Join[
r1 = Range[min, min + ( max - min)/10, (max - min)/100],
r2 = Range[1/100 (19 max + 81 min), max, (9 (max - min))/100]
];
Print[{min, max, r1, r2}];
ret
]])
, ContourStyle -> (
Join @@ {Table[Thick, {Length@r1}], Table[Thin, {Length@r2}]}
)
]


{-4.39976,-3.40577,{-4.39976,-4.38982,-4.37988,-4.36994,-4.36,-4.35006,-4.34012,-4.33018,-4.32024,-4.3103,-4.30036},{-4.2109,-4.12144,-4.03198,-3.94252,-3.85306,-3.7636,-3.67415,-3.58469,-3.49523,-3.40577}}

I included a Print statements to get feedback on where the Contours are been placed. No idea why the plot is missing a half.

• Yes, exactly like this, thank you rhermans :) Aug 8, 2014 at 13:44
• @11drsnuggles11, Good! If this answers your question and closes the topic you can mark the answer as "accepted". Aug 8, 2014 at 13:48
• Is there a way so that i don' have to give the specific values of the range of the function values like [0,1] but rather say: make 10 contours for [min, 0.9 max] and 10 contours for [0.9 max, max]? Aug 8, 2014 at 14:17
• @11drsnuggles11, kguler gave you an excellent answer to that. Aug 8, 2014 at 16:15
• thanks again for your help, rhermans. the plot is "missing" a half because of "{n2, 0, 5 - n1}" . the plot gives the energy of a specific system depending on deposited amount of material. n1 is the material in a so called wetting layer and n2 is the amount of material deposited in 3d-structures, the total amount h=n1+n2, thus i cut half of the plot, because in the missing half of the plot there is the unrealistic case: n1+n2> h. Aug 9, 2014 at 12:49

An alternative syntax for Contours that combine contours and styles:

cntrplt[expr_, arg1_, arg2_, contours : {{_, _} ..}, opts : OptionsPattern[]] :=
ContourPlot[expr, arg1, arg2, Contours -> Join @@ Thread /@ contours, opts];


Using @rhermans' example:

cntrplt[1 - Exp[-x - y], {x, 0, 2}, {y, 0, 2},
{{Range[0, .9, 1/10], Thick}, {Range[.91, 1, 1/100], Thin}},
PlotRange -> {0, 1}]


Update:

a way so that i don' have to give the specific values of the range of the function values like [0,1] but rather say: make 10 contours for [min, 0.9 max] and 10 contours for [0.9 max, max]

ContourPlot[1 - Exp[-x - y], {x, 0, 2}, {y, 0, 2},
Contours -> (Function[{min, max},
Module[{r1, r2},
Join[r1 = Range[min, .9 max, (.9 max - min)/10],
r2 = Range[.9 max + .01, max, (max - .9 max - .01)/10]]]]),
ContourStyle -> (Join @@ {Table[Thick, {Length@r1}], Table[Thin, {Length@r2}]})]


• Thank you, kguler. Since i am a beginner with mathematica, i have to look into some things to fully understand what you presented me here ;) Aug 8, 2014 at 15:02
• kgular, where in your code do you retrieve the min and max value of the range of function values and store it in "min" and "max"? Aug 8, 2014 at 17:53
• @11drsnuggles11, when you use a pure function to generate the contours the two arguments of the function (min and max) are calculated automatically. The only information about this usage are the examples 6 and 7 in ContourPlot>>Options>>Contours, and a short blob in Contours>>Details
– kglr
Aug 8, 2014 at 18:09
• ... (BTW, you could also use the simpler form Contours -> (Join[Range[#1, .9 #2, (.9 #2 - #1)/10], Range[.9 #2 + .01, #2, (#2 - .9 #2 - .01)/10]] &) to specify the set of contours using a pure function.)
– kglr
Aug 8, 2014 at 18:10
• I tried to apply that piece of code to my actual function, unfortunately it doesn' work and i don't know why. I have edited my question and posted a simplified version of my function. Aug 8, 2014 at 19:05

Borrowing from @rhermans:

Framed[ContourPlot[Sin[x y], {x, 0, 2}, {y, 0, 2},
Contours -> Join[Range[0, 0.9, 0.1], Range[0.91, 1, 0.01]],
Frame -> {{True, False}, {True, False}},
ColorFunction -> "Pastel",
ContourStyle ->
Join[Table[Directive[Brown, Thick], {10}], Table[Directive[Dashed, Thin], {9}]],
ContourLabels -> Function[{x, y, z}, Text[Framed[z], {x, y}, Background -> White]],
ImageSize -> 600],
FrameMargins -> 20]


• Thank you, eldo. Do you know the answere to my comment to rhermans answere? Aug 8, 2014 at 15:00