エラーバー付きの棒グラフを作成するにはどうすればよいですか? | Stata FAQ
例えば、作文の点数を人種や人種ごとに分けて調べたとします。 各グループの平均値と信頼区間を、下図のようなエラーバー付きの棒グラフを使ってグラフ化したいと思います。
Image barcap1
まず、使用するデータ ファイルを取得します。
use https://stats.idre.ucla.edu/stat/stata/notes/hsb2, clear
さて、collapseコマンドを使って、平均値と標準偏差をbraceとsesにしてみましょう。
collapse (mean) meanwrite= write (sd) sdwrite=write (count) n=write, by(race ses)
さて、信頼区間の上限値と下限値を作ってみましょう。
generate hiwrite = meanwrite + invttail(n-1,0.025)*(sdwrite / sqrt(n))generate lowrite = meanwrite - invttail(n-1,0.025)*(sdwrite / sqrt(n))
さて、データの棒グラフを作る準備が整いました。 graph barコマンドで、かなりきれいな棒グラフができます。
graph bar meanwrite, over(race) over(ses)Image barcap2
以下のようにasyvarsオプションを追加することで、もう少しきれいなグラフにすることができます。
graph bar meanwrite, over(race) over(ses) asyvarsImage barcap3
しかし、このグラフにはエラーバーが入っていません。 残念ながら、グラフバーコマンドは、エラーバーを許可していません。 しかし、下の図のように、エラーバーを持つ2方向のグラフを作ることができます。
graph twoway (bar meanwrite race) (rcap hiwrite lowrite race), by(ses)Image barcap4
さて、困ったことになりました。 graph barコマンドは、美しい棒グラフを作成しますが、エラーバーをサポートしません。 twoway barコマンドは、美しいエラーバーを作成しますが、graph barコマンドのような美しいグラフにはなりませんでした。 しかし、twoway barコマンドを微調整して、graph barコマンドに似たグラフを作成し、それにエラーバーを組み合わせることができます。
まず、セスとレースの情報を含む単一の変数である、変数sesraceを作成します。
generate sesrace = race if ses == 1replace sesrace = race+5 if ses == 2replace sesrace = race+10 if ses == 3sort sesracelist sesrace ses race, sepby(ses) +---------------------------------+ | sesrace ses race | |---------------------------------| 1. | 1 low hispanic | 2. | 2 low asian | 3. | 3 low african-amer | 4. | 4 low white | |---------------------------------| 5. | 6 middle hispanic | 6. | 7 middle asian | 7. | 8 middle african-amer | 8. | 9 middle white | |---------------------------------| 9. | 11 high hispanic | 10. | 12 high asian | 11. | 13 high african-amer | 12. | 14 high white | +---------------------------------+
次に、graph twowayを使用してグラフを作成します。 4本の棒が3つのグループに分かれていることに注目してください。 3つのグループは、3つのレベルのsesに対応し、各グループ内の4本のバーは、4つのレベルの人種に対応しています。 このグループ分けは、上で述べた人種の構築方法と関連付けることができます。
twoway (bar meanwrite sesrace)Image barcap5
次に、エラー バーを重ね合わせて、rcap グラフを作成します。
twoway (bar meanwrite sesrace) (rcap hiwrite lowrite sesrace)Image barcap6
これは、私たちが望むもののように見えます。 しかし、4つの異なる人種のそれぞれのバーが異なる色であれば、より美しく見えるでしょう。
twoway (bar meanwrite sesrace if race==1) /// (bar meanwrite sesrace if race==2) /// (bar meanwrite sesrace if race==3) /// (bar meanwrite sesrace if race==4) /// (rcap hiwrite lowrite sesrace)Image barcap7これは良くなっていますが、凡例を使って棒にもっと良いラベルを付けてみましょう。
twoway (bar meanwrite sesrace if race==1) /// (bar meanwrite sesrace if race==2) /// (bar meanwrite sesrace if race==3) /// (bar meanwrite sesrace if race==4) /// (rcap hiwrite lowrite sesrace), /// legend( order(1 "Hispanic" 2 "Asian" 3 "Black" 4 "White") )Image barcap8
凡例はバーをうまく表示しています。 また、グラフのX軸が、3つの棒のグループが3つのゴマのグループに対応していることを伝えないようにすると、よりすっきりします。 この点については、xlabel()オプションを使って改善できます。 また、x軸とy軸にもより良いタイトルを追加しました。
twoway (bar meanwrite sesrace if race==1) /// (bar meanwrite sesrace if race==2) /// (bar meanwrite sesrace if race==3) /// (bar meanwrite sesrace if race==4) /// (rcap hiwrite lowrite sesrace), /// legend(row(1) order(1 "Hispanic" 2 "Asian" 3 "Black" 4 "White") ) /// xlabel( 2.5 "Low" 7.5 "Middle" 12.5 "High", noticks) /// xtitle("Socio Economic Status") ytitle("Mean Writing Score")Image barcap9
これで、グラフバーから得られるような種類のグラフができましたが、グラフツーウェイバーを微調整することで、このようなきれいなグラフを作ることができました。 その後、rbar グラフを重ねて、希望するエラー バーを得ることができました。