ggplot の boxplot でデータもプロットすると,jitter が使われて悲惨な結果になる
http://rpubs.com/msonnabaum/ebs_piops
"EBS provisioned IOPS" がその一つの例だろう。
library(ggplot2)
library(reshape)
df.ebs <- read.csv("http://dl.dropbox.com/u/361076/raw_ebs_stats.csv")
df.ebs.melted <- melt(df.ebs, id = c("bricks", "server_type", "instance_id"),
variable_name = "op", na.rm = TRUE)
df.ebs.melted$test = "ebs"
df.piops <- read.csv("http://dl.dropbox.com/u/361076/raw_piops_stats.csv")
df.piops.melted <- melt(df.piops, id = c("bricks", "server_type", "instance_id"),
variable_name = "op", na.rm = TRUE)
df.piops.melted$test <- "piops"
df <- rbind(df.ebs.melted, df.piops.melted)
ggplot(df, aes(x = factor(bricks), y = value, colour = test)) + geom_boxplot() +
geom_jitter(alpha = 0.3) + facet_grid(~op)
悲惨というほかない。グチャグチャだ。
これを,どうやってまともなグラフにするか。
df2 <- split(df, df$op)
x <- c(1,2,3,3,5,4,7,5)
col = c("#88000020", "#00888820")
layout(matrix(1:2, 1))
par(mar=c(2, 2.5, 1, 1), mgp=c(1.6, 0.6, 0))
aa <- lapply(df2, function(d2) {
df3 <- split(d2, d2$bricks)
boxplot(value ~ bricks, data=d2, ylim=c(0, 550), boxwex = 0.25, cex=0.5,
subset=test=="ebs", at=1:5-0.2, col=col[1], main=d2$op[1])
legend("top", c("ebs", "piops"), pch=19, col=col, bty="n")
sapply(df3, function(d3) {
v <- d3$value[d3$test=="ebs"]
segments(x[d3$bricks]-0.05, v, x[d3$bricks]+0.02, v, col=col[1])
})
boxplot(value ~ bricks, data=d2, ylim=c(0, 550), boxwex = 0.25, cex=0.5,
subset=test=="piops", at=1:5+0.2, col=col[2], main=d2$op[1],
xaxt="n", add=TRUE)
sapply(df3, function(d3) {
v <- d3$value[d3$test=="piops"]
segments(x[d3$bricks]+0.35, v, x[d3$bricks]+0.42, v, col=col[2])
})
})
layout(1)
すると,こういうグラフになる。
「キレイなグラフがカンタンに描ける」というとき,「キレイ」というのは,そのプログラム(パッケージ)を作った人の主観。「カンタン」というのも同じ。