Check out the legends on these two graphs (the first one is the problem legend, the second one is the better legend):
For the first one, I used the command:
. graph bar (mean) appliedmed hospitalized [aw=expfact], over(exempt) ...
and in the legend, it used "mean of [variable name]" instead of using the variable label. If you use the option nolabel after the graph bar command, you would just get "[variable name]" in the legend. How do you get stata to use the variable labels in the legend instead of the variable names, like in the second graph above? (note that, in the second graph, my program makes the variable labels go over two lines when they are long, and makes the line break at a space, not in the middle of a word). Use the following code:
Usage:
/ local vlist appliedmed hospitalized
. makelegendlabelsfromvarlabels `vlist', local(relabellegend) c(30)
. graph bar (mean) `vlist' [aw=expfact], over(exempt) title(`"Share reporting applied for medical assistance in the past 30 days"') ytitle("Fraction of group", margin(medium)) blabel(total, format(%9.2fc)) subtitle("Average for each group") legend(size(vsmall) `relabellegend')
Where the program makelegendlabelsfromvarlabels is defined as below. In the above, the option c(30) tells stata that the first line should have only 30 characters, and that the rest of the value label should be placed on the line below.
program define makelegendlabelsfromvarlabels
// Written by Shafique Jamal (shafique.jamal@gmail.com). 25 Nov 2012
//
// Wrote it to fix an annoyance with graph bar. I want graph bar to use variable labels, not variable names, in the legend, but it won't do this if I am using a "(stat)" rather than "(asis)"
syntax varlist, local(name local) [c(integer 30)]
version 9.1
// local charlength = 30
tempname count
local `count' = 0
tempname labeloptions
tempname variablelabel
foreach var of local varlist {
local `count' = ``count'' + 1
local `variablelabel' : variable label `var'
// It would be great to break this up at a word boundary if the length is > 34 characters
if (length(`"``variablelabel''"') > `c') {
tempname variablelabel_part1
tempname variablelabel_part2
tempname variablelabel_tochange
tempname positionofspace
tempname positionofspace_prev
tempname exitwhileloop
local `exitwhileloop' = 0
local `positionofspace' = 0
local `variablelabel_tochange' `"``variablelabel''"'
while (``exitwhileloop'' == 0) {
local `positionofspace' = strpos(`"``variablelabel_tochange''"', " ")
if (``positionofspace'' >= `c' | ``positionofspace''==0) {
local `exitwhileloop' = 1
}
else {
local `positionofspace_prev' = ``positionofspace''
local `variablelabel_tochange' = subinstr(`"``variablelabel_tochange''"'," ",".",1)
}
}
local `variablelabel_part1' = substr(`"``variablelabel''"', 1, ``positionofspace_prev'')
local `variablelabel_part2' = substr(`"``variablelabel''"', ``positionofspace_prev'' + 1, . )
local `labeloptions' `"``labeloptions'' label(``count'' `"``variablelabel_part1''"' `"``variablelabel_part2''"') "'
}
else {
local `labeloptions' `"``labeloptions'' label(``count'' `"``variablelabel''"') "'
}
}
// di `"labeloptions: ``labeloptions''"'
// need to return this in a local macro
c_local `local' `"``labeloptions''"'
end program
For the first one, I used the command:
. graph bar (mean) appliedmed hospitalized [aw=expfact], over(exempt) ...
and in the legend, it used "mean of [variable name]" instead of using the variable label. If you use the option nolabel after the graph bar command, you would just get "[variable name]" in the legend. How do you get stata to use the variable labels in the legend instead of the variable names, like in the second graph above? (note that, in the second graph, my program makes the variable labels go over two lines when they are long, and makes the line break at a space, not in the middle of a word). Use the following code:
Usage:
/ local vlist appliedmed hospitalized
. makelegendlabelsfromvarlabels `vlist', local(relabellegend) c(30)
. graph bar (mean) `vlist' [aw=expfact], over(exempt) title(`"Share reporting applied for medical assistance in the past 30 days"') ytitle("Fraction of group", margin(medium)) blabel(total, format(%9.2fc)) subtitle("Average for each group") legend(size(vsmall) `relabellegend')
Where the program makelegendlabelsfromvarlabels is defined as below. In the above, the option c(30) tells stata that the first line should have only 30 characters, and that the rest of the value label should be placed on the line below.
program define makelegendlabelsfromvarlabels
// Written by Shafique Jamal (shafique.jamal@gmail.com). 25 Nov 2012
//
// Wrote it to fix an annoyance with graph bar. I want graph bar to use variable labels, not variable names, in the legend, but it won't do this if I am using a "(stat)" rather than "(asis)"
syntax varlist, local(name local) [c(integer 30)]
version 9.1
// local charlength = 30
tempname count
local `count' = 0
tempname labeloptions
tempname variablelabel
foreach var of local varlist {
local `count' = ``count'' + 1
local `variablelabel' : variable label `var'
// It would be great to break this up at a word boundary if the length is > 34 characters
if (length(`"``variablelabel''"') > `c') {
tempname variablelabel_part1
tempname variablelabel_part2
tempname variablelabel_tochange
tempname positionofspace
tempname positionofspace_prev
tempname exitwhileloop
local `exitwhileloop' = 0
local `positionofspace' = 0
local `variablelabel_tochange' `"``variablelabel''"'
while (``exitwhileloop'' == 0) {
local `positionofspace' = strpos(`"``variablelabel_tochange''"', " ")
if (``positionofspace'' >= `c' | ``positionofspace''==0) {
local `exitwhileloop' = 1
}
else {
local `positionofspace_prev' = ``positionofspace''
local `variablelabel_tochange' = subinstr(`"``variablelabel_tochange''"'," ",".",1)
}
}
local `variablelabel_part1' = substr(`"``variablelabel''"', 1, ``positionofspace_prev'')
local `variablelabel_part2' = substr(`"``variablelabel''"', ``positionofspace_prev'' + 1, . )
local `labeloptions' `"``labeloptions'' label(``count'' `"``variablelabel_part1''"' `"``variablelabel_part2''"') "'
}
else {
local `labeloptions' `"``labeloptions'' label(``count'' `"``variablelabel''"') "'
}
}
// di `"labeloptions: ``labeloptions''"'
// need to return this in a local macro
c_local `local' `"``labeloptions''"'
end program
4 comments:
Thank you Shafique, I have used this little program and it saved me a lot of time.
Alex from UK
Hello Alex,
Great! Glad to know it helped, and thanks for leaving a comment.
Cheers,
Looks like a great programme - thanks for writing it! Any chance of a short help file to go along?
Thank you for this, it helped me a lot!
Post a Comment