问题
I am outputting stacked bar plots in Stata, with each stacked bar ordered from bottom -> up : largest -> smallest Wins % per team.
clear
set obs 10
gen team = "yankees" if inlist(_n, 1, 6)
replace team = "red sox" if inlist(_n, 2, 7)
replace team = "mets" if inlist(_n, 3, 8)
replace team = "nationals" if inlist(_n, 4, 9)
replace team = "astros" if inlist(_n, 5, 10)
gen wins = -10 + 20 * _n
replace wins = wins[11 - _n] in 6/10
gen year = cond(_n <= 5, 2013, 2014)
gen season = "regular" in 1/10
set obs 16
replace team = "yankees" if inlist(_n, 11, 14)
replace team = "red sox" if inlist(_n, 12, 15)
replace team = "astros" if inlist(_n, 13)
replace team = "mets" if inlist(_n, 16)
replace wins = -10 + 30 * (_n-10) in 11/16
replace wins = wins[17 - _n] in 14/16
replace year = 2013 in 11/13
replace year = 2014 in 14/16
replace season = "playoffs" in 11/16
foreach x in "regular" "playoffs"{
preserve
keep if season == "`x'"
#delimit ;
graph bar (mean) wins, over(team, sort(1) descending) over(year, label(ticks labs(small))) asyvars stack
ytitle("Wins (%)")
title("Wins Percentages in `x'")
blabel(bar, position(center) format(%9.0f) size(2.5) color(white))
legend(size(2) rowgap(*.45) pos(6) rows (2) region(style(legend) fcolor(gs15) margin(medsmall)) colgap(*.75) symxsize(*.75) keygap(*.33));
#delimit cr
restore


The issue is that team colors vary across graphs, because not all regular season teams are present in the playoffs, and color is assigned alphabetically. For example, the red sox are yellow in graph 1, but green in graph 2.
From Stata's help menu, the only modification appears to be by bar #:
bar(#, barlook_options) look of #th yvar bar
for example:
graph bar yvar1 yvar2, bar(1,color(green)) bar(2,color(red))
I'm looking for
graph bar yvar1 yvar2, bar(team=="Yankees",color(blue)) bar(team=="Red Sox",color(red))
http://www.stata.com/statalist/archive/2011-03/msg00097.html offers guidance, but not the outcome described above.
回答1:
This is a partial answer only, to be supplemented if someone else or I can take it further.
Taking your sandbox example, and rewriting the code in ways not important for your question,
clear
set obs 10
gen team = "yankees" if inlist(_n, 1, 6)
replace team = "red sox" if inlist(_n, 2, 7)
replace team = "mets" if inlist(_n, 3, 8)
replace team = "nationals" if inlist(_n, 4, 9)
replace team = "astros" if inlist(_n, 5, 10)
gen wins = -10 + 20 * _n
replace wins = wins[11 - _n] in 6/10
gen year = cond(_n <= 5, 2013, 2014)
#delimit ;
graph bar (mean) wins, over(team, sort(1) descending) over(year, label(ticks labs(small))) asyvars stack
ytitle("Wins (%)")
title("Wins")
blabel(bar, position(center) format(%9.0f) size(2.5) color(white))
legend(size(2) rowgap(*.45) pos(6) rows (2) region(style(legend) fcolor(gs15) margin(medsmall)) colgap(*.75) symxsize(*.75) keygap(*.33));
#delimit cr
my idea was to separate into a variable for each team:
separate wins, by(team) veryshortlabel
That then allows this kind of graph:
graph hbar (asis) wins? , over(team) over(year) nofill legend(off)

This might be a better foundation for your more complicated problems. (I am not sure whether we are expected to understand the baseball arcana. Indeed, is this baseball? These details are not universally understood.)
My own view is that stacking of bars would make the graph worse, but that is a different question.
来源:https://stackoverflow.com/questions/30653129/consistent-barplot-colors-across-graphs-in-stata