56

次の問題があります。箱ひげ図で離散変数と連続変数を視覚化したいのですが、後者には極端に高い値がいくつかあります。これにより、箱ひげ図が無意味になります (グラフのポイントと「本体」でさえ小さすぎる)。そのため、これを 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 スケールのボックスプロットをプロットするソリューションを知っている人はいますか?このスレッドformatterのような関数でラベルを自由にフォーマットできますか?


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

私が本当に求めているもの: 1 つの log10 変換された軸 (y) で、科学的なラベルはありません。(formatter=dollar)ドルまたはカスタム形式のようにラベルを付けたいと思います。

@hadley の提案を試すと、次の警告が表示されます。

> 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 軸のラベルを変更しない場合:

代替テキスト

4

4 に答える 4

40

最も簡単な方法は、目的のログ関数の名前または名前のscale_x_continuousいずれかの「trans」(以前の「formatter」) 引数を与えることです。scale_y_continuous

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

編集:または、それが気に入らない場合は、これらのいずれかが異なるが有用な結果をもたらすように見えます:

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)

于 2011-01-15T14:35:47.117 に答える
19

私は同様の問題を抱えていましたが、このスケールは魅力のように機能しました:

breaks = 10**(1:10)
scale_y_log10(breaks = breaks, labels = comma(breaks))

中間レベル (10^3.5) も必要なので、フォーマットを微調整する必要があります。

breaks = 10**(1:10 * 0.5)
m <- ggplot(diamonds, aes(y = price, x = color)) + geom_boxplot()
m + scale_y_log10(breaks = breaks, labels = comma(breaks, digits = 1))

実行後::

ここに画像の説明を入力

于 2011-02-09T10:30:21.393 に答える
9

、およびを使用scale_y_log10した別のソリューションtrans_breakstrans_formatannotation_logticks()

library(ggplot2)

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

m + geom_boxplot() +
  scale_y_log10(
    breaks = scales::trans_breaks("log10", function(x) 10^x),
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  ) +
  theme_bw() +
  annotation_logticks(sides = 'lr') +
  theme(panel.grid.minor = element_blank())

于 2018-08-08T16:42:06.030 に答える
1

視覚化する前に、データを手動で変換することで、ようやくそれが得られたと思います。

d <- diamonds
# computing logarithm of prices
d$price <- log10(d$price)

そして、後で対数データを「逆」に計算するためのフォーマッタを作成します。

formatBack <- function(x) 10^x 
# or with special formatter (here: "dollar")
formatBack <- function(x) paste(round(10^x, 2), "$", sep=' ') 

そして、指定されたフォーマッタでプロットを描画します:

m <- ggplot(d, aes(y = price, x = color))
m + geom_boxplot() + scale_y_continuous(formatter='formatBack')

代替テキスト

私が以前に解決できたはずの質問でお騒がせして、コミュニティに申し訳ありません! おもしろいのは、1 か月前にこのプロットを機能させるために懸命に取り組んだのですが、うまくいきませんでした。こちらで質問したら、了解しました。

とにかく、モチベーションをくれた @DWin に感謝します!

于 2011-01-15T17:47:05.560 に答える