- 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()



















