0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

geom_barにおけるy軸の対数変換について

Posted at

準備

例として以下のような、dplyr::group_byでグループ化したデータフレームを用意する。

library(dplyr)
library(magrittr)
library(ggplot2)

df <- data.frame(
  x = rep(c(1, 2, 4), c(10, 1, 20)),
  g = rep_len(c("a", "b"), 31)
)
df %<>% group_by(g)
table(df)
##    g
## x    a  b
##   1  5  5
##   2  1  0
##   4 10 10

そのままプロットするとこんな感じになって、特におかしなところはない。

# プロットできる
ggplot(df, aes(x = x)) +
  geom_bar()

unnamed-chunk-3-1.png

ところがこれにscale_y_log10を使ってy軸を対数変換すると表示がおかしくなる。

# プロットできるがおかしい(なんか増えてね…?)
ggplot(df, aes(x = x)) +
  geom_bar() +
  scale_y_log10()

unnamed-chunk-4-1.png

グループを見えるようにするとよく分かるが、対数変換した後に積んでいるので、y軸との対応が取れなくなっている。

# こういうこと(対数変換してから積んでる)
ggplot(df, aes(x = x, fill = g)) +
  geom_bar() +
  scale_y_log10()

unnamed-chunk-5-1.png

それぞれのグループの変換自体は正しいので、position=dodgeを指定すれば矛盾のない表示になる。

# こうすれば良い
ggplot(df, aes(x = x, fill = g)) +
  geom_bar(position = "dodge") +
  scale_y_log10()

unnamed-chunk-6-1.png

あるいはungroupしてしまってもよい。

# ungroupする
ggplot(ungroup(df), aes(x = x)) +
  geom_bar() +
  scale_y_log10()

unnamed-chunk-7-1.png

ところでy軸を対数変換する別の方法として、scale_y_continuoustrans=引数を使うものがあるが、このとき"log1p"を指定すると、値に1を足した上で対数変換が行われる。こうすると1と0の区別ができるようになる。y軸の値ラベルはきちんと調整されるので、ずれることもない。

# プロットできる(1を消さない)
ggplot(ungroup(df), aes(x = x)) +
  geom_bar() +
  scale_y_continuous(trans = "log1p")

unnamed-chunk-8-1.png

y軸を対数変換するさらに別の方法としてcoord_transを使うものがある。これはデータではなく軸の方を変換するためなのか、上記のデータはungroupしてもしなくてもプロットできない。

# プロットできない
ggplot(df, aes(x = x)) +
  geom_bar() +
  coord_trans(y = "log10")
# プロットできない
ggplot(ungroup(df), aes(x = x)) +
  geom_bar() +
  coord_trans(y = "log10")

一方、軸の方の変換なので、coord_trans"log1p"を使えばposition="stack"の状態でもy軸との関係を正しく保った状態でプロットができる(グラフとしてこれが適切なのかというと微妙だが)。

# プロットできる
ggplot(df, aes(x = x, fill = g)) +
  geom_bar() +
  coord_trans(y = "log1p")

unnamed-chunk-9-1.png

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?