0
votes

I can't quite grasp how to insert a variable's value labels for titles to a graph.

For example, in sysuse auto, the variable foreign takes the value of 0 or 1 where 0 is labeled "Domestic" and 1 is labeled "Foreign".

In the following snippet, I want to plot the average price for each category of the variable foreign using a loop:

sysuse auto, clear
forvalues i=0/1{
    local t = foreign[`i'] 
    graph bar (mean) price if foreign == `i', ///
        over(rep78, sort(price) descending) asyvars ///
        title("`t'") name(p_`i', replace) nodraw 
    local graphs `graphs' p_`i'
}
gr combine `graphs' 

but it does not even display the category value correctly in the title.

What am I doing wrong?

2

2 Answers

2
votes

Your code

local t = foreign[`i']

sets the local macro t to the value of the variable foreign first in observation 0 and then in obseration 1: these will be missing and 0, respectively.

What you want is the value label corresponding to the values 0 and 1, which you can obtain with

local t : label (foreign) `i'

Swap this into your code and your graphs will be labelled Domestic and Foreign, respectively.

The syntax of the replacement command may be unfamiliar; macro "extended functions" are described in help extended_fcn.

0
votes

Note that either of these graph commands

sysuse auto, clear

graph bar (mean) price , ///
over(rep78, sort(price) descending) asyvars over(foreign) 

graph bar (mean) price , ///
over(rep78, sort(price) descending) asyvars by(foreign) 

uses value labels automatically and produces a combined graph directly. This may not be the main question, but the original code is not a good solution on those grounds.