1. ホーム
  2. r

[解決済み] ggplot2で1軸のみをlog10スケールに変換する

2022-03-09 21:07:46

質問

離散変数と連続変数をボックスプロットで可視化したいのですが、後者に極端に高い値が数個あります。これはボックスプロットを無意味にし(ポイントやチャートの本体さえも小さすぎます)、それが私がこれをlog10スケールで表示したい理由です。視覚化から極端な値を除外することができることは承知していますが、私はそれを意図していません。

ダイヤモンドのデータで簡単な例を見てみましょう。

m <- ggplot(diamonds, aes(y = price, x = color))

<イグ

ここでは深刻な問題ではないのですが、なぜlog10のスケールで値を見たいのか、想像していただけたでしょうか。試してみましょう。

m + geom_boxplot() + coord_trans(y = "log10")

<イグ

見ての通り、y軸はlog10スケーリングされており、問題なく見えますが、x軸に問題があり、プロットが非常におかしくなっています。

で問題が発生することはありません。 scale_log しかし これは私にとってはオプションではありません この方法では、カスタムフォーマッターを使用することができないからです。例えば

m + geom_boxplot() + scale_y_log10() 

<イグ

質問:Y軸にlog10のスケールを持つboxplotをプロットするソリューションを知っている人はいますか? formatter のような関数があります。 スレッド ?


回答やコメントをもとに、回答者を支援するための質問を編集しています。

私が本当に求めているもの:科学的でないラベルを持つ1つのlog10変換された軸(y)。私はそれをドルのようにラベル付けしたいと思います (formatter=dollar) または任意のカスタムフォーマット。

ハドレーさんの提案を試すと、以下のような警告が表示されます。

> m + geom_boxplot() + scale_y_log10(formatter=dollar)
Warning messages:
1: In max(x) : no non-missing arguments to max; returning -Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
3: In max(x) : no non-missing arguments to max; returning -Inf

y軸のラベルを変更しない場合。

解決方法は?

一番簡単なのは、'trans' (旧 'formatter') 引数に scale_x_continuous または scale_y_continuous には、希望するログ関数の名前を指定します。

library(ggplot2)  # which formerly required pkg:plyr
m + geom_boxplot() + scale_y_continuous(trans='log10')

EDIT もし、それが嫌なら、これらのどちらかは、異なるが有用な結果を与えるように見える。

m <- ggplot(diamonds, aes(y = price, x = color), log="y")
m + geom_boxplot() 
m <- ggplot(diamonds, aes(y = price, x = color), log10="y")
m + geom_boxplot()

EDIT2 & 3: さらなる実験(ログ値の前に"$"記号を置くことに成功したものを破棄した後)。

# Need a function that accepts an x argument
# wrap desired formatting around numeric result
fmtExpLg10 <- function(x) paste(plyr::round_any(10^x/1000, 0.01) , "K $", sep="")

ggplot(diamonds, aes(color, log10(price))) + 
  geom_boxplot() + 
  scale_y_continuous("Price, log10-scaling", trans = fmtExpLg10)

<イグ

パッケージの構文変更に関するコメントで2017年半ばに追記。

<ブロッククオート

scale_y_continuous(formatter = 'log10') は scale_y_continuous(trans = 'log10') に変更になりました (ggplot2 v2.2.1)