Statalist The Stata Listserver

[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

Re: st: Modifying a graphics command: problem with nested suboptions

From   "Austin Nichols" <>
Subject   Re: st: Modifying a graphics command: problem with nested suboptions
Date   Thu, 8 Jun 2006 10:14:49 -0400

Eva Poen --
Interesting question, and I'm not sure of the answer.  Without testing
a lot of possible solutions, my first instinct would be to make the
by() option a string, i.e.
 syntax varlist(min=2 max=2) [if] [in] [, BY(str) *]
and parse the string in `by' with a lot of traps for errors (most of
which you could copy from official Stata .ado files, traps that is,
not errors).

You could also write a subroutine (another program in your .ado file)
that would validate what is in `by' via another syntax command, but
that seems less straightforward to me.

You might want to consider adding support for weights
(I assume a call to -collapse- is the workhorse here,
followed by a call to -tw bar-, and -collapse- supports weights).

On 6/8/06, Eva Poen <> wrote:
Dear all,

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?

Thanks a lot,
*   For searches and help try:

*   For searches and help try:

© Copyright 1996–2022 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index