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}, > ContourShading->False] > > 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[[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[1], TextStyle -> {FontSize -> 10}}][Graphics[p1][[1]]]], 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[1], TextStyle -> {FontSize -> 12}}][p2[[1]]]], 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 djmp at earthlink.net http://home.earthlink.net/~djmp/