[GRASS-user] Horizontal legend font size

Paul Moen pmoen at nd.gov
Wed Aug 13 09:50:08 EDT 2008


What I am doing is creating a map dynamically for our web.  The grass part
of the script is,
            g.mapset mapset=Temp 2>>$errtext
            v.in.ascii input=$textFile output=$RasName fs='tab' x=3 y=4
skip=0 cat=1 2>>$errtext
            v.surf.rst input=$RasName at Temp layer=1 zcolumn=dbl_3 tension=40.
elev=$RasName2 dmax=5 dmin=2 2>>$errtext
            g.remove vect=$RasName 2>>$errtext
            r.colors map=$RasName2 at Temp color=arb-precip 2>>$errtext
            r.out.tiff input=$RasName2 at Temp compression=lzw -t
output=\"".$workingdir."/".$RasName."\" 2>>$errtext
            d.mon start=PNG 2>>$errtext
            d.frame -c frame=map at=11,100,0,100
            d.rast $RasName2 at Temp 2>>$errtext
            d.vect counties at Temp fcolor=none type=boundary 2>>$errtext
            d.frame -c frame=leg at=1,10,5,95 2>>$errtext
            d.legend -s range=0,15.0 labelnum=5 at=70,99,7,93
map=$RasName2 at Temp  2>>$errtext
            d.mon stop=PNG 2>>$errtext
            g.remove rast=$RasName2 2>>$errtext


On 8/13/08 2:42 AM, "Hamish" <hamish_b at yahoo.com> wrote:

> Paul Moen wrote:
>> I want to create a horizontal legend for a raster.
>> 
>> The docs say,
>> 
>>> When using the mouse or at to size & place the
>>   legend, a user may create a horizontal legend by making
>>   the box wider than it is tall.
>> 
>> I read the previous line to mean the only way to create a
>> legend is to use at and make the box wider than it is tall.
>>  Is that correct?
> 
> Yes.
> 
>> Can I make a legend horizontal without using at=bottom,top,left,right
> 
> From the command line and xmons you can use 'd.legend -m' to place the
> legend with the mouse. I am not sure if you get the same chance from
> the GUIs or if the only option there is filling in at=.
> 
> 
>> The docs also say,
>> 
>>> Vertical legends produced with d.legend will place text
>>   labels to the right of the legend box, horizontal legends
>>   will place text below. This text will be auto-scaled to fit
>>   within the frame, reducing the size of the legend if
>>   necessary. Legends positioned with the mouse or with
>>   the at option will not auto-scale text, in order to provide
>>   more control to the user.
>> 
>> The last line that says that the text will not auto-scale
>> when using at,
> 
> correct. Only d.legend without at= or -m will autoscale. If manually
> placed it will assume you know what you are doing and give you exactly
> what you requested.
> 
> WRT horizontal scales, I think it only autoscales from the right side of the
> window, not the bottom. But anyway, full labels are useless in a
> horiz legend, they just fall on top of each other.
> 
> but see below- what is being autoscaled is the category label.
> 
> e.g. "d.legend -n landcover.30m" in the spearfish dataset then adjust
> the window so it is narrower and watch it autoscale.
> 
> 
>> which means that a horizontal legend¹s text will never auto-scale
>> since the horizontal legend can only be made by using at to create
>> a box that is wider than it is tall. Am I misinterpreting anything?
> 
> a couple of things:
> you can make a box wider than it is tall on an xmon using the -m "place
> with mouse" command line flag. The GUIs don't use xmons, which forces the
> use of at=.
> 
> But what I meant by "text labels" is for categorical legends not tick numbers.
> e.g.:
>  [red] pine forest
>  [blue] deciduous forest
>  [grey] urban area
> in this case the "pine forest" text would automatically shrink if it would
> fall off the right side of the window.
> 
> For horizontal legends font size is purely a function of legend width.
> (for vertical legends it is the legend height)
> I guess for horiz legends I could look at rotating the font 90deg for
> categorical legends with text labels (set with r.cats/r.category). But
> I'd wait for strong user demand before spending any time on that.
> 
>  
>> My problem is that I get a horizontal legend that looks great except
>> the text is huge and looks awful.
> 
> you mean numbers (category or value) or text labels of categories?
> could you provide a screenshot?
I have no categories, so it would be the values.  You can see the output at
http://www.swc.state.nd.us/getPrecipMap.php
I would like to add a few more labels labelnum=7 with smaller text.

It would also be nice to turn off the borders on the frames, although that
is another topic.
> 
> is this a floating point (FCELL or DCELL) or categorical (CELL) map?
>  [r.info]
FCELL
> 
>  
>> How can I change the size of the text in the legend?
> 
> you need to recompile d.legend with the following patch:
> 
> Index: display/d.legend/main.c
> ===================================================================
> --- display/d.legend/main.c     (revision 32734)
> +++ display/d.legend/main.c     (working copy)
> @@ -672,7 +672,7 @@
>             if (!horiz)
>                 txsiz = (int)((y1 - y0) / 20);
>             else
> -               txsiz = (int)((x1 - x0) / 20);
> +               txsiz = (int)((x1 - x0) / 25);
>  
>             /* scale text to fit in window if position not manually set */
>             /* usually not needed, except when frame is really narrow   */
> 
> 
> adjust the divisor to suit. The above patch makes the font super tiny
> for legends which are around 2-3 inches wide, so I am loathe to apply
> it in SVN. Maybe it would be better to make textsize it a fn of width^2
> so the rate of change was not so dramatic.
> 
I will see if I can figure out the recompiling to see how it works.
>  
>> The following are my commands.
>> 
>> d.rast raster at Temp
>> d.frame -c frame=leg at=1,10,5,95
>> d.legend -s range=0,13.5 labelnum=5 at=80,100,5,95 map=raster at Temp
> 
> after changing the scaling with the above patch, this looks nice for me:
>   d.legend -s range=0,13.5 labelnum=4 at=50,90,5,95 map=
> 
> 
> 
> regards,
> Hamish
> 
> 
> 
> 
> 

Paul T. Moen
pmoen at nd.gov
701-328-2434
701-328-3696 (fax)
ND State Water Commission



More information about the grass-user mailing list