LoginSignup
4
2

More than 5 years have passed since last update.

ggplot2のscale_fill_manualではまったところ

Last updated at Posted at 2017-01-11

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

hoge.png

# ならばと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

hoge.png

# 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

hoge.png

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2