I should have given an example. This basic
strategy is used in -stripplot- from SSC. That example
is germane to Eva as it implements both an
-over()- and a -by()-. The same applies to -beamplot-
from the same place.
With regard to other answers, it is rather
pessimistic to split off the -by(varname)-
and the -byopts(options)-. Trying to emulate -by()-
is a little tricky but worth trying.
Nick
[email protected]
Nick Cox
> In two words, use -gettoken-.
>
> First off, the -syntax- statement for -by()- is better as
>
> BY(str asis)
>
> The following code should help:
>
> if `"`by'"' != "" {
> gettoken by opts : by, parse(",")
> gettoken comma opts : opts, parse(",")
> local byby `"by(`by', `opts')"'
> }
>
> Your byvariable is now in local macro by
> and you can pass local macro byby to -twoway graph-.
>
> You will probably need to add some flourishes
> to this to get the behaviour you want.
>
> Other details can be seen by looking inside user-written
> graphics programs that provide -by()- support.
>
> Nick
> [email protected]
>
> Eva Poen
>
> > I am in the process of writing a small graphics command. It is
> > supposed to produce a bar chart like
> >
> > -graph bar (mean) price, over(rep78) by(foreign)-
> >
> > but with the number of observations (or percentages) represented by
> > each bar added to the graph. The program is based on some code
> > suggested by Nick Cox to one of my colleagues.
> >
> > So far, my syntax statement reads:
> >
> > syntax varlist(min=2 max=2) [if] [in] [, BY(varname) *]
> >
> > I added the * to the options list to capture any general graphics
> > options the user might give. But I need to explicitly state the by()
> > option (instead of leaving it to *), because I need the
> by-Variable in
> > some of the calculations before creating the graph.
> >
> > The problem comes with the nested suboptions for -graph, twoway-. If
> > the user specifies the by() option in my program, some of
> the general
> > graphics options need to go inside by() for the final graph (e.g.
> > legend(position()), title()) while others go outside by(), like
> > xlabel(), xtitle(), legend(col()).
> >
> > How can I best implement this in my program? I thought about adding
> > another option called byoption to capture everything that
> needs to go
> > inside by(), but it seems rather inelegant. Or is there an
> easy way to
> > scan the general options list created by * for the existence of by()
> > and extract just the variable name, for use in my calculations?
>
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/