ggplot2がデータをアルファベット順にソートしてからプロットする仕様のために、ソートしてほしくない時に辛かった話。
以下のような状況だった。
library("ggplot2")
# B,A,Cの順番のまま棒グラフにしたいとする
# 並び順を示す数値もあるとする(3列目)
# Bは赤 Aは緑 Cは青に色付けしたいとする
dat <- read.table(text=
"B 12.3 1
B 12.1 1
B 15.2 1
B 11.3 1
B 14.6 1
B 15.3 1
B 16.1 1
B 11.5 1
B 12.6 1
A 18.7 2
A 14.6 2
A 13.9 2
A 15.4 2
A 14.2 2
A 16.5 2
A 14.3 2
A 17.1 2
C 15.4 3
C 19.6 3
C 15.2 3
C 25.5 3
C 35.5 3
C 45.2 3
C 55.4 3
C 35.4 3", header = FALSE)
colnames(dat) <- c("Variable", "Value", "Order")
# ggplot2はアルファベット順にソートしてからプロットしてしまうため、間違えて色付けしてしまう
bx <- ggplot(dat, aes(x=Variable, y=Value, fill=Variable))
bx <- bx + geom_boxplot()
bx <- bx + stat_boxplot(geom = "errorbar")
bx <- bx + scale_fill_manual(values=c("red", "green", "blue"))
bx
# ならばとreorderで無理やりB,A,Cの順にすると、scale_fill_manualはソート前の順番で色付けしてしまうために赤、緑、青の順にならない
bx <- ggplot(dat, aes(x=reorder(Variable, Order), y=Value, fill=Variable))
bx <- bx + geom_boxplot()
bx <- bx + stat_boxplot(geom = "errorbar")
bx <- bx + scale_fill_manual(values=c("red", "green", "blue"))
bx
# ggplotはlevelsが返す順番でプロットしているらしい
levels(dat$Variable)
# levelsの順番を自分で設定するといいらしい
# 参考 : http://stackoverflow.com/questions/20041136/avoid-ggplot-sorting-the-x-axis-while-plotting-geom-bar
dat <- read.table(text=
"B 12.3 1
B 12.1 1
B 15.2 1
B 11.3 1
B 14.6 1
B 15.3 1
B 16.1 1
B 11.5 1
B 12.6 1
A 18.7 2
A 14.6 2
A 13.9 2
A 15.4 2
A 14.2 2
A 16.5 2
A 14.3 2
A 17.1 2
C 15.4 3
C 19.6 3
C 15.2 3
C 25.5 3
C 35.5 3
C 45.2 3
C 55.4 3
C 35.4 3", header = FALSE, stringsAsFactors = FALSE)
colnames(dat) <- c("Variable", "Value", "Order")
dat$Variable <- factor(dat$Variable, levels = unique(dat$Variable))
# これだとうまいく
bx <- ggplot(dat, aes(x=reorder(Variable, Order), y=Value, fill=Variable))
bx <- bx + geom_boxplot()
bx <- bx + stat_boxplot(geom = "errorbar")
bx <- bx + scale_fill_manual(values=c("red", "green", "blue"))
bx