Hez,
This would seem to address everything except what I started this thread to
query, namely more control over the placement of the separate exponent label
when scientific notation is used for labelling. Looking a bit into the code,
the placement of this string is hard-wired into the label_box{} routine in
plbox.c, e.g.:
sprintf(string, "(x10#u%d#d)", (int) yscale);
offset = 0.02;
height = 2.0;
if (lny) {
pos = 0.0 - offset;
plmtex("t", height, pos, 1.0, string);
}
What I was hoping to do was to allow control these inputs to plmtext, e.g., to
allow us to:
Place the string at some other height from the acis
Place the string at some other pos along the axis
[I guess control the justification]
Control, independent of the orientation of the numeric labels the orientation
(e.g., "t" or "tv") of string
One way to do this I guess would be to hold all these parameters in PLStream,
from which label_box could get them, together with a flag indicating if the
default values should be used instead. This would then require a new api
routine to set these values, e.g.,
plsexppos(axis, orient, height, pos, just, usedefault)
where axis is one of x,y, or z (PLStream would need separate entries for all
three as the user can't reset them inbetween drawing the different axes from a
single call to plbox) and the rest of the entries are self-explanatory and
match those of plmtex. [I haven't looked at the 3d routines to see what needs
to be done for the z-axis.]
I could imagine an option to suppress the exponent altogether and simply return
the appropriate string, so that the user could pass it directly to plmtex
him/herself or, better I think, embed it in the label string - i.e., construct
"Temperture (x10#u6#d K)". However, this is extremely dangerous as it relies on
the user to do this, otherwise his/her plot is incorrectly labelled. I guess it
would be straightforward for a user to specify the same position for both the
axis label and exponent, but with one left-justified and the other
right-justified and, with only a small tweak, create the same effect in a way
that was less dangerous for the innocent user.
Since you'll be digging into this bit of code anyway, and since you know your
way 'round the plplot code and practices much better than I, perhaps you could
have a go at this at the same time as you're implementing your generalised
labelling routines?
Cheers
Steve
________________________________________
From: [email protected]
[[email protected]] On Behalf Of Hezekiah M. Carty
[[email protected]]
Sent: 27 April 2009 18:50
To: Jonathan Woithe
Cc: PLplot development list; Hazen Babcock
Subject: Re: [Plplot-devel] control position of floating point label
On Sun, Apr 26, 2009 at 11:51 PM, Jonathan Woithe
<[email protected]> wrote:
> Hi Hez
>
>> > I suggest you go ahead and implement any improvement you would like to see
>> > in PLplot axis scaling. Of course, be sure and test such improvements for
>> > all anticipated QSAS axis scaling needs.
>>
>> Would it be considered reasonable to some form of user-customizable
>> axis labeling API in PLplot by providing callbacks similar to the pltr
>> functions used by plcont and friends? The axis labeling code could
>> remain mostly as-is. However, when a custom labeling function is
>> defined, rather than rendering the text which matches the actual
>> number at a given axis location, that number would be passed to the
>> user-provided function. This function would return a string with the
>> appropriate label based on the provided floating point value. If the
>> user wants to capture extra label information in this function (scale
>> magnitude, for example) they could do so.
>
> Speaking as someone who regularly prepares plots for scientific publication,
> having a custom labelling function for the axis labels would be great.
> Currently the bulk of my work isn't done using plplot but rather with a
> custom plotting framework I wrote around plotutils, but as part of that API
> I included precisely this functionality because I was always needing to
> label things with something apart from just the literal numeric value.
Given that bit of encouragement and my own use for such functionality,
I have started digging in to plbox.c to see what needs to happen. As
it looks right now, the changes seem fairly straightforward. To avoid
breaking the API, I think the simplest thing to do is to define a
plslabelfunc(labelf) function, with labelf having a signature similar
to:
void labelf(PLINT xyz, PLFLT value, PLINT scale, PLINT precision,
char* string, PLINT len, PLINT ll, PLINT lf);
Arguments:
- xyz: Is this a label for the X, Y or Z axis?
- value: The axis value to generate a label from
- scale, precision, ll, lf: See plform in plbox.c. These could be
used or ignored by labelf
- string: This holds the text of the label to render (plmtex formatting)
- len: Maximum length of string
plslabelfunc(labelf) would then associate labelf with the current plot
stream. Any calls to plbox/plaxes which request a custom x or y (or
z?) axis label would use labelf rather than the defaults in plbox to
get the string representation of the numeric label. If no custom
label function is defined then the code could either use plabort or
just silently fall back on the default labeling system. Clearing
custom label functions would require calling plslabelfunc(NULL). The
changes to existing functions plbox.c would be fairly noninvasive,
just the addition of a few more variables and if-branches.
To sum up:
1) This would add one new function to the public PLplot API: plslabelfunc()
2) New constants could be added as well for the xyz argument described above
3) This would add 2 (3) new letters to the format string taken by
plbox (plbox3). I propose "x" "y" and "z" for custom X, Y and Z axes,
respectively.
4) This should not change any existing code - everything which does
not use plslabelfunc() would continue to function as-is.
Does this seem like a reasonable approach? Any suggestions for
improvements? Is plslabelfunc an acceptable name or is there
something better anyone wants to suggest? I don't mind more verbose
function names (pl_set_label_function) but the existing PLplot API
tends to be pretty terse.
If this is ok'd by the powers that be I am willing to work on this
during the 5.9.4 development period.
Hez
--
Hezekiah M. Carty
Graduate Research Assistant
University of Maryland
Department of Atmospheric and Oceanic Science
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensign option that enables unlimited
royalty-free distribution of the report engine for externally facing
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Plplot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/plplot-devel
------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations
Conference from O'Reilly Media. Velocity features a full day of
expert-led, hands-on workshops and two days of sessions from industry
leaders in dedicated Performance & Operations tracks. Use code vel09scf
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
_______________________________________________
Plplot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/plplot-devel