2017-10-16 18 views
1

多くの変数にわたって2つのグループ(男性/女性など)を比較するグラフをたくさん作成します。標準的なグラフバー出力は、男性用のすべてのバーと、女性用のすべてのバーをまとめたものです。私は目標変数(すなわち、変数がグラフ化されている)でバーをグループ化し、次に性別などの変数を使って棒グラフを作成する簡単な方法を見つけることを望んでいます。グラフ変数をターゲット変数でソートした後にソート変数をソートする

私はこれを行う方法がありますが、それはかなり面倒です。以下の図を参照してください。

*Set seed + obs 
clear 
set seed 442 
set obs 100 

*Generate two outcomes 
gen x1 = uniform() 
gen x2 = uniform() 

*Generate crossing variable 
gen gender = 0 in 1/50 
replace gender = 1 in 51/100 
label define gender_lab 0 "Male" 1 "Female" 
label values gender gender_lab 

*Extract means by gender 
gen b_male = . 
gen b_female = . 
sum x1 if gender == 0 
replace b_male = r(mean) in 1 
sum x1 if gender == 1 
replace b_female = r(mean) in 1 
sum x2 if gender == 0 
replace b_male = r(mean) in 2 
sum x2 if gender == 1 
replace b_female = r(mean) in 2 

*Establish order of graph 
gen index_male = _n*3 in 1/2 
gen index_female = (_n*3) + 1 in 1/2 


*This is what -graph bar- produces naturally 
graph bar x1 x2, over(gender) 

*This is closer to what I want 
twoway bar b_male index_male || bar b_female index_female, xlabel(3.5 "x1" 6.5 "x2", notick labgap(4)) xmlabel(3 "Male" 4 "Female" 6 "Male" 7 "Female") legend(off) 

graph barを使用していますが、まだ私が欲しいのソート順を確立するための簡単な方法はありますか?私は一日に何十枚ものグラフを作成するので、できるだけ不必要なステップを避けたい。

答えて

3

これはモデルの質問です。ありがとうございました!

私は最初にあなたのコードをコピーしますが、何らかの小さな単純化があれば興味深いでしょう。

*Set seed + obs 
clear 
set seed 442 
set obs 100 

*Generate two outcomes 
gen x1 = runiform() 
gen x2 = runiform() 

*Generate crossing variable 
gen gender = _n > 50 
label define gender_lab 0 "Male" 1 "Female" 
label values gender gender_lab 

*Extract means by gender 
sum x1 if gender == 0 
gen b_male = r(mean) in 1 
sum x1 if gender == 1 
gen b_female = r(mean) in 1 
sum x2 if gender == 0 
replace b_male = r(mean) in 2 
sum x2 if gender == 1 
replace b_female = r(mean) in 2 

*Establish order of graph 
gen index_male = _n*3 in 1/2 
gen index_female = (_n*3) + 1 in 1/2 

*This is what -graph bar- produces naturally 
graph bar x1 x2, over(gender) name(G1) 

*This is closer to what I want 
twoway bar b_male index_male || bar b_female index_female, /// 
xlabel(3.5 "x1" 6.5 "x2", notick labgap(4))    /// 
xmlabel(3 "Male" 4 "Female" 6 "Male" 7 "Female") legend(off) name(G2) 

良いニュースは、あなたがSSCからエリック・A.ブースと自分でstatplotをインストールした後、1ラインのソリューションが存在することです。 (エリックのための電子メール・アドレスは、ヘルプファイルは、もはや現在ではありません。)

ssc inst statplot 
statplot x1 x2, over(gender) 
statplot x1 x2, over(gender) recast(bar) 
statplot x1 x2, over(gender) recast(bar) asyvars yla(, ang(h)) /// 
bar(2, bcolor(orange*0.8)) bar(1, bcolor(blue*0.8)) 

ここで行われているかを示すために、最後のグラフです。

statplotデフォルトは、表示するものなので、平均を計算する必要はありません。他の統計も利用可能です。

enter image description here

+0

私はかつて-statplot-のことを聞いていたが、それについて忘れてしまいました。私はそれを思い出して、私の問題を解決する完璧なイラストをつけてうれしいです。ありがとう! – Amberopolis

+0

私はそれも時々忘れて、私はその2番目の著者です。 –

関連する問題