       RE: Contour labeling

• To: mathgroup at smc.vnet.net
• Subject: [mg24350] RE: [mg24288] Contour labeling
• From: "David Park" <djmp at earthlink.net>
• Date: Sun, 9 Jul 2000 04:52:54 -0400 (EDT)
• Sender: owner-wri-mathgroup at wolfram.com

```> -----Original Message-----
> From: Tom Aldenberg [mailto:Tom.Aldenberg at rivm.nl]
To: mathgroup at smc.vnet.net
>
> Dear All,
>
> How can one label contour lines with their function values? For
> example, when
> using the following command:
>
> ContourPlot[Sin[x y], {x, -1, 1}, {y, -1, 1}, Contours->{-.5, .5},
>
> one wants to indicate, which contour refers to -.5,  and which one to .5.
>
> Best regards,
> Peter Janssen
>

Peter,

The Tom Wickham-Jones ExtendGraphics routines, available from MathSource at
the Wolfram site, have a package ExtendGraphics`LabelContour` which will
label contours. However, when I tried this in Version 4 it did not work
because it uses an obsolete graphics option. I don't know if his package has
been updated.

Considering that problem, and also considering that it might not just be
contour lines that we wish to label, I wrote a new routine which I hope will
be useful.

Options[DrawLineLabels] = {DrawLLFormat -> (NumberForm[#1, 2] & ),
DrawLLTextOptions -> {}};

DrawLineLabels::usage = "DrawLineLabels[function, position, opts][expr] will
label all the \
lines in expr. function is a pure function of two variables which is applied
to the choosen \
point to generate the value of the label. position is a pure function that
should generate a \
number between 0 and 1. It specifies the fractional number of plot points
along the line for \
the label placement. position = 0.5& will put the labels at roughly the
midpoint of each line. \
position = Random[]& will put the labels at random positions. The option
DrawLLFormat can be \
used to set a format specification for the labels. The default is
(NumberForm[#,2]&). The \
option DrawLLTextOptions can be used to add options to the Text statements
that produce the \
labels.";

DrawLineLabels[function_, fracposition_, opts___][expr_] :=
Module[{lines, format, textoptions},
format := DrawLLFormat /. {opts} /. Options[DrawLineLabels];
textoptions = DrawLLTextOptions /. {opts} /. Options[DrawLineLabels];
lines = Flatten[Cases[expr, Line[_], Infinity]];
(Module[{pos, val, point, len}, len = Length[#1[]];
pos = Min[Max[Floor[fracposition[]*len], 1], len]; point =
#1[[1,pos]];
val = function @@ point; Text[format[val], point, Sequence @@
textoptions]] & ) /@
lines]

Here is an example of its use on a contour plot. I used the regular number
of contours, and also color shading.

p1 = ContourPlot[Sin[x*y], {x, -1, 1}, {y, -1, 1}, ColorFunction -> Hue,
DisplayFunction -> Identity];

Show[p1, Graphics[DrawLineLabels[Sin[#1*#2] & , 0.5 & , DrawLLTextOptions ->
{Background -> GrayLevel, TextStyle -> {FontSize ->
10}}][Graphics[p1][]]],
ImageSize -> 500, DisplayFunction -> \$DisplayFunction];

Here is an example of its use in labeling multiple curves from a single Plot
statement.

f[x_, c_] := 2c x + c

This gives us an expression for c, if we know a point {x, y} on a curve. We
will use it to obtain a value for labeling each line.

Solve[y == f[x, c], c]
{{c -> y/(1 + 2*x)}}

p2 = Plot[Evaluate[Table[f[x, c], {c, -2, 3}]], {x, -2, 2},
DisplayFunction -> Identity];

Show[p2, Graphics[DrawLineLabels[#2/(1 + 2*#1) & , 0.8 & ,
DrawLLTextOptions ->
{Background -> GrayLevel, TextStyle -> {FontSize ->
12}}][p2[]]],
ImageSize -> 500, DisplayFunction -> \$DisplayFunction];

I am planning to add this routine to my DrawingPaper package in the near
future. It is somewhat easier to use there.

David Park