- 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を使わない場合)
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を使う場合)
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文を使わずに積み上げる場合)
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文を使って積み上げる場合)
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()