Re: Making nice-looking Legend for Plot

*To*: mathgroup at smc.vnet.net*Subject*: [mg89731] Re: Making nice-looking Legend for Plot*From*: lehin.p at gmail.com*Date*: Thu, 19 Jun 2008 05:43:12 -0400 (EDT)*References*: <g35g09$9bm$1@smc.vnet.net> <g37f0v$pts$1@smc.vnet.net>

On 17 June, 08:36, "David Park" <djmp... at comcast.net> wrote: > In your particular case, with only two curves, why use a legend at all? W= hy > not just directly label the curves as follows? > > Plot[{100/x, x/1000 + 1}, {x, 100, 433}, > Epilog -> {Text["NMA", {196.056, 0.587105}], > Text["DMA", {183.881, 1.27148}]}, > AspectRatio -> 1/2, > Frame -> True, Axes -> False, > FrameLabel -> {x, "curves"}, > PlotRange -> {0, 1.5}, > PlotLabel -> Style["NMA and DMA Curves", 12], > ImageSize -> 400] > > I always find the PlotLegend package difficult to use. It is hard to obta= in > precise control. So if one must have a legend it is easier to construct i= t > by hand. The advantage is that you know exactly what is happening. Here i= s > how I would do it with the Presentations package: > > Needs["Presentations`Master`"] > > With[ > {location = {.75, .4}, > legendsize = {.20, .25}, > shadowoffset = {.02, -.03}, > laboffset = .04, > lineoffset = .1, > linelength = .08, > lab1yoffset = .17, > lab2yoffset = .06}, > Draw2D[ > {(* Legend Frame *) > Rectangle[Scaled[location + shadowoffset], > Scaled[location + legendsize + shadowoffset]], > White, > Rectangle[Scaled[location], Scaled[location + legendsize]], > > (* NMA curve *) > Blend[{Blue, Black}, .5], > Draw[100/x, {x, 100, 433}], > Text["NMA", Scaled[location + {laboffset, lab1yoffset}]], > Line[{Scaled[location + {lineoffset, lab1yoffset}], > Scaled[location + {lineoffset + linelength, lab1yoffset}]}], > Blend[{Red, Black}, .5], > > (* DMA curve *) > Draw[x/1000 + 1, {x, 100, 433}], > Text["DMA", Scaled[location + {laboffset, lab2yoffset}]], > Line[{Scaled[location + {lineoffset, lab2yoffset}], > Scaled[location + {lineoffset + linelength, lab2yoffset}]}]}, > > AspectRatio -> 1/2, > Frame -> True, > FrameLabel -> {x, "curves"}, > PlotLabel -> Style["NMA and DMA Curves", 12], > ImageSize -> 400] > ] > > Legends generally are not good devices even though they are often used. > Basically they are just another 'plot' that detracts from the main plot. > That's why it is much better to directly label the curves if you can. Why > label curves indirectly when you can label them directly? The one place > where a legend might be useful is for contour or density plots. And there= it > is better to construct your own. And the contour line tooltips on > Mathematica contour plots are better than any legend. So throw the Legend > package into the trash can and save yourself a lot of grief. > > If there are many intertwined curves then it may be impossible to directl= y > label them in a useful manner. That would seem to call for a legend. But = how > does a legend really help there? The main problem is to be able to pick o= ut > each curve and yet show it in relation to the other curves. I have an > example in the Presentations package that shows a method for doing this. = It > uses a TabView for multiple graphics and each graphic shows one curve and > its data points with the other curves in a fainter subdued representation=