質問

次の問題があります。ボックスプロット上の離散変数と連続変数を視覚化したいと思います。これにより、BoxPlotが意味がなくなってしまいます(チャートのポイントと「ボディ」は小さすぎます)。そのため、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

私の質問:ラベルを自由にフォーマットできるy軸にlog10スケールでboxplotをプロットするソリューションを知っている人はいますか? 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軸ラベルを使用してください。

alt text

役に立ちましたか?

解決

最も簡単なのは、「トランス」(以前の「フォーマッタ」引数にログ関数の名前を与えることだけです。

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_continous(trans = 'log10')(ggplot2 v2.2.1)になりました

他のヒント

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

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

使用した別のソリューション scale_y_log10trans_breaks, trans_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())

視覚化の前にデータを使用して手動変換を行うことで、ついに手に入れたと思います。

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に感謝します!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top