plot bar charts with ggplot2

geom_bar

geom_bar の使い方

サンプルデータを利用して ggplot で棒グラフを描く例。

library(ggplot2)

# データの準備
data <- read.table("https://stats.biopapyrus.jp/https://bi.biopapyrus.jp/ai/machine-learning/svm/hard-margin-svm.html", header = T, sep = ",")

# ggplot 用のデータフレームを作成。
# group に実験グループ名、length に各グループの平均値を保存
df <- data.frame(group = colnames(data), length = colMeans(data, na.rm = T))
df
##    group   length
## At    At 1.043846
## S5    S5 2.520769
## S4    S4 3.373333
## S3    S3 4.556923
## S2    S2 4.610833

# 描画レイヤーを一枚ずつ重ねあわせる
g <- ggplot(
  df,                    # ggplot 用データフレーム
  aes (                  # ggplot オプション設定
    x = group,           # x 軸を df$group とする
    y = length,          # y 軸を df$length とする
    fill = group         # df$group に従ってグループ分ける
  )
)
g <- g + geom_bar(                    # plotbarに当たる関数
  width = 0.8,                        # 棒の幅
  stat = "identity"
)
g <- g + xlab("Groups")            # x 軸名
g <- g + ylab("Length (cm)")       # y 軸名
g <- g + ggtitle("Seeds Height")   # グラフ名

plot(g)
ggplot2による棒グラフの描画

横軸のラベルを垂直にすることも可能。theme 関数の axis.text を調整して利用する。上の g に次のレイヤーを加える。

g <- g + theme(axis.text = element_text(angle = 90))
plot(g)
ggplot2による棒グラフの描画

棒グラフグルーピング

複数のカテゴリに分類されているデータをカテゴリごとにグルーピングして棒グラフに描く場合、グルーピングしたい属性の名前を fill オプションに与える。

積み上げ棒グラフ

行列型のデータから積み上げグラフを描く例。行列型のデータは melt 関数を利用してデータフレームに変換した後に、ggplot に適用させる。(サンプルデータ

library(ggplot2)
library(reshape2)

# データの読み込み
data <- read.table("https://stats.biopapyrus.jp/r/basic/string.html", header = T, sep = "\t")

# 遺伝子名をデータの 1 列目に追加
data <- cbind(gene = rownames(data), data)
data 
##          gene H.sapiens M.musculus A.thaliana T.Cass
## gene_1 gene_1        10         20          0      0
## gene_2 gene_2        19         10         19     13
## gene_3 gene_3         7          5          6      4
## gene_4 gene_4         0          0          9     12
## gene_5 gene_5         4          1          3      0

# ggplot2用のデータフレームを作成します。
df <- melt(data)
head(df)
##     gene   variable value
## 1 gene_1  H.sapiens    10
## 2 gene_2  H.sapiens    19
## 3 gene_3  H.sapiens     7
## 4 gene_4  H.sapiens     0
## 5 gene_5  H.sapiens     4
## 6 gene_1 M.musculus    20


g <- ggplot(
  df,
  aes (
    x = gene,             # 遺伝子別でグルーピング
    y = value,
    fill = variable       # 縦軸を生物種で fill up 
  )
)
g <- g + geom_bar(stat = "identity")
plot(g)
ggplot2による積み上げ棒グラフの描画

横並びの棒グラフ

ggplot で、棒グラフを横に並べて描く方法。

library(ggplot2)
library(reshape2)

data <- read.table("https://stats.biopapyrus.jp/r/basic/string.html", header = T, sep = "\t")
data <- cbind(gene = rownames(data), data)
df <- melt(data)

g <- ggplot(
  df,
  aes (
    x = variable,         # 生物種別でグルーピング
    y = value,
    fill= gene            # 縦軸を遺伝子名で fill up 
  )
) 
g <- g + geom_bar(position = "dodge", stat = "identity") 
plot(g)
ggplot2による横並びの棒グラフの描画

分割して棒グラフを描く方法

項目でグルーピングしてから、棒グラフを分割して描く方法。

library(ggplot2)
library(reshape2)

data <- read.table("https://stats.biopapyrus.jp/r/basic/string.html", header = T, sep = "\t")
data <- cbind(gene = rownames(data), data)
df <- melt(data)

g <- ggplot(
  df,
  aes (
    x = gene,                      # 遺伝子名でグルーピング
    y = value,
    fill= gene                     # 縦軸を遺伝子名で fill up 
  )
)
g <- g + geom_bar(stat = "identity")
g <- g + facet_grid(variable ~ .)  # 生物種ごとにグラフを描く

plot(g)
ggplot2による積み上げと横並びの棒グラフの描画

各グループに含まれるサンプルの数を棒グラフで描く

各グループのサンプル数を棒グラフとして描く例。

library(ggplot2)
library(reshape2)

df <- data.frame(
  group = c("A", "A", "B", "B", "C", "D", "D", "D", "D", "B"),
  value = c(12.1, 12.23, 22.3, 24.1, 3.7, 21.8, 24.0, 19.4, 19.2, 22.1)
)

g <- ggplot(
  df,
  aes (
    x = group,      # group ごとに何個のサンプルが含まれているかをカウント
    fill = group    # group ごとに色の塗り分けを行う
  )
)
g <- g + geom_bar(stat = "bin")

plot(g)
ggplot2による棒グラフ

棒グラフにエラーバーを追加する方法

棒グラフにエラーバーを追加するには geom_error を加えるだけでよい。ただし、誤差範囲を予め計算しておく必要がある。

library(reshape2)
library(ggplot2)
 
# データの準備(A、B、C の3グループにそれぞれ20個のデータをランダム生成する)
data <- data.frame(
  group_A = rnorm(20, 10, 4), 
  group_B = rnorm(20, 20, 2), 
  group_C = rnorm(20, 15, 3)
)
 
 
# ggplot 用のデータフレームを作成(平均と標準偏差を計算する)
df <- data.frame(
  group = colnames(data),
  mean  = apply(data, 2, mean),
  sd    = apply(data, 2, sd)
)

head(df)
##           group     mean       sd
## group_A group_A  9.73736 3.804823
## group_B group_B 19.38303 2.528263
## group_C group_C 13.80851 2.733864

 
# 描画キャンパスを作成
g <- ggplot(
  df,                           # ggplot2 用のデータフレーム
  aes (                         # 座標の設定情報
    x = group,                  # x 座標を group の値をセット
    y = mean,                   # y 座標に mean の値をセット
    fill = group
  )
)
g <- g + geom_bar(stat = "identity")  # 棒グラフのレイヤー
g <- g + geom_errorbar(               # エラーバーのレイヤー
  aes(
    ymin = mean - sd,
    ymax = mean + sd,
    width = 0.3
  ))
 
plot(g) 
棒グラフとエラーバー