web-dev-qa-db-ja.com

ggplot2で1つの軸のみをlog10スケールに変換します

次の問題があります:箱ひげ図の離散変数と連続変数を視覚化したいのですが、後者ではいくつかの極端に高い値があります。これにより、箱ひげ図が無意味になります(グラフのポイントと「ボディ」さえも小さすぎます)。そのため、これをlog10スケールで表示したいと思います。視覚化から極端な値を除外できることは承知していますが、そうするつもりはありません。

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

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

alt text

ここでは問題は深刻ではありませんが、log10スケールで値を表示する理由を想像していただければ幸いです。試してみよう:

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

alt text

ご覧のとおり、y軸はlog10でスケーリングされ、見た目はきれいですが、x軸に問題があるため、プロットが非常に奇妙になります。

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

m + geom_boxplot() + scale_y_log10() 

alt text

私の質問:誰もがラベルをこの thread のようなformatter関数で自由にフォーマットできるy軸にlog10スケールで箱ひげ図をプロットする解決策を知っていますか?


回答とコメントに基づいて回答者を助けるために質問を編集する:

私が本当に望んでいるのは、科学的なラベルではない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軸ラベルの場合:

alt text

36
daroczig

最も単純なのは、単に 'trans'(以前の 'formatter'引数にログ関数の名前を与えることです:

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:さらなる実験(ログに記録された値の前に「$」記号を置くことに成功したものを破棄した後):

fmtExpLg10 <- function(x) paste(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)

alt text

パッケージ構文の変更に関するコメントに2017年半ばに追加された注:

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

26
42-

私は同様の問題を抱えており、このスケールは魅力のように私のために働いた:

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

実行後::

enter image description here

14

_scale_y_log10_、_trans_breaks_、_trans_format_およびannotation_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())
_

4
Tung

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

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')

alt text

私が以前に解決できたであろう質問であなたを煩わせるためにコミュニティに申し訳ありません!面白い部分は、1か月前にこのプロットを機能させるために一生懸命働いていたが、成功しなかったことです。ここで尋ねた後、私はそれを得た。

とにかく、やる気を起こしてくれた@DWinに感謝!

0
daroczig