- Step3. 実践編
- 1. データの整理と可視化
1-4. 積み上げ棒グラフ
次のデータは、「Step0. 初級編 2-3. 積み上げ棒グラフを読み取ってみよう」で用いたデータです。このデータを使って、積み上げ棒グラフの作成を行ってみましょう。
ファイルのダウンロードはこちらから
- (日本語)neko_ensoku.csv
- (英語)neko_ensoku_eng.csv
■Excelによる解析例
- 「neko_ensoku.csv」のデータを選択(A1セルからE7セルまで)
- 挿入 > すべてのグラフを表示 > 積み上げ縦棒を選択
- デフォルトのグラフが出力される
- デフォルトのグラフを加工
※棒グラフ間の線(区分線)を入れる場合には、次の手順で行います。:出力されたグラフをクリック > グラフツールのデザイン > グラフ要素の追加 > 線 > 区分線を選択
※100% 積み上げ縦棒を選択すると、各データ全体を100%としたときの各項目の割合を表す棒グラフを描くことができます。
■Rによる解析例
・その1(packageを使わない場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | dat <- read.csv ( "neko_ensoku_eng.csv" , header=T, row.names = 1) #データの読み込み dat2 <- t (dat[1:6,1:4]) #必要なデータ(1~6行目、1~4列目)の抽出&転置(行列の入れ替え) #積み上げ棒グラフ barplot (dat2, #barplot関数にデータをセット ylab = "Frequency" , #y軸ラベルを設定 legend = rownames (dat2), #凡例をセット col= topo.colors (4)) #棒グラフの色を設定(topo.colorsのカラースケールを4分割) #100%積み上げ棒グラフ par (mar= c (5, 5, 4, 10)) #凡例がグラフに重ならないようにするため、余白を設定 barplot ( prop.table (dat2, 2), #列ごとの割合を算出 ylab = "Proportion" , legend = rownames (dat2), col= topo.colors (4), args.legend = list (x = "topright" , inset = c (-0.25, 0))) #凡例の位置を設定 dev.off () #描画設定を初期値に戻す |
■Rによる解析例
・その2(ggplot2を使う場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | library (reshape2) library (ggplot2) dat <- read.csv ( "neko_ensoku_eng.csv" , header=T, row.names = 1) #データの読み込み dat2 <- melt ( as.matrix (dat[1:6,1:4])) #データを縦に並べかえる #積み上げ棒グラフ G1 <- ggplot (dat2, aes (x = Var1, y = value, fill = Var2)) + #x軸、y軸、塗りつぶしの色のデータを設定 geom_bar (stat = "identity" ) + #与えられた値をそのまま棒グラフとして使う scale_fill_brewer (palette = "Set2" ) + #棒グラフの色を設定(Set2というカラーパレットを使用) labs (x = "" , y = "Frequency" , fill = "Category" ) + #グラフのラベルを設定 theme (panel.grid.major = element_blank (), #背景のgridの削除 panel.grid.minor = element_blank (), #背景のgridの削除 panel.background = element_blank (), #背景色の削除 axis.line= element_line (colour = "black" ), #グラフの線の色を指定 axis.ticks= element_line (colour = "black" ), #グラフの目盛(ticks)の色を指定 axis.text= element_text (size = 14), #グラフの目盛のフォントサイズを指定 axis.title= element_text (size = 16), #グラフのラベルのフォントサイズを指定 legend.text= element_text (size = 14), #凡例のフォントサイズを指定 legend.title= element_text (size = 16)) #凡例のラベルのフォントサイズを指定 plot (G1) #100%積み上げ棒グラフ G2 <- ggplot (dat2, aes (x = Var1, y = value, fill = Var2)) + geom_bar (stat = "identity" , position = "fill" ) + scale_fill_brewer (palette = "Set2" ) + labs (x = "" , y = "Proportion" , fill = "Category" ) + #与えられた値をそのまま棒グラフとして使う+100%に積み上げる theme (panel.grid.major = element_blank (), panel.grid.minor = element_blank (), panel.background = element_blank (), axis.line= element_line (colour = "black" ), axis.ticks= element_line (colour = "black" ), axis.text= element_text (size = 14), axis.title= element_text (size = 16), legend.text= element_text (size = 14), legend.title= element_text (size = 16)) plot (G2) |
■Pythonによる解析例
・その1(for文を使わずに積み上げる場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import pandas as pd import matplotlib.pyplot as plt dat = pd.read_csv( "neko_ensoku_eng.csv" , index_col = 0 ) #データの読み込み dat2 = dat.iloc[ 0 : 6 , 0 : 4 ] #必要なデータの抽出 #積み上げ棒グラフ dat2.plot.bar(stacked = True ) #クロス集計表データから積み上げ棒グラフを作成 plt.legend(dat2.columns, fontsize = 10 ) #凡例の項目、フォントサイズの設定 plt.ylabel( "Frequency" , fontsize = 10 ) #y軸ラベルを設定、フォントサイズの設定 plt.show() #グラフの出力 #100%積み上げ棒グラフ dat3 = dat2.copy() #dat2をdat3へコピー for i in range ( 6 ): #for文を使って列ごとの割合を算出 dat3.iloc[i,:] = dat3.iloc[i,:] / dat3.iloc[i,:]. sum () dat3.plot.bar(stacked = True ) plt.legend(dat2.columns, fontsize = 10 , loc = 'upper left' , bbox_to_anchor = ( 1 , 1 )) #凡例の項目、フォントサイズ、位置の設定 plt.ylabel( "Proportion" , fontsize = 10 ) plt.tight_layout() #グラフの要素が画面からはみ出さないようにする plt.show() |
■Pythonによる解析例
・その2(for文を使って積み上げる場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import pandas as pd import matplotlib.pyplot as plt dat = pd.read_csv( "neko_ensoku_eng.csv" , index_col = 0 ) dat2 = dat.iloc[ 0 : 6 , 0 : 4 ] #積み上げ棒グラフ fig, ax = plt.subplots() #グラフの大枠の作成 for i in range ( 4 ): #for文を使って列ごとデータを積み上げる ax.bar(dat2.index, dat2.iloc[:,i], bottom = dat2.iloc[:,:i]. sum (axis = 1 )) plt.legend(dat2.columns, fontsize = 10 ) plt.ylabel( "Frequency" , fontsize = 10 ) plt.show() #100%積み上げ棒グラフ dat3 = dat2.copy() for i in range ( 6 ): dat3.iloc[i,:] = dat3.iloc[i,:] / dat3.iloc[i,:]. sum () fig, ax = plt.subplots() for i in range ( 4 ): ax.bar(dat3.index, dat3.iloc[:,i], bottom = dat3.iloc[:,:i]. sum (axis = 1 )) plt.legend(dat2.columns, fontsize = 10 , loc = 'upper left' , bbox_to_anchor = ( 1 , 1 )) plt.ylabel( "Proportion" , fontsize = 10 ) plt.tight_layout() plt.show() |