次の問題があります:箱ひげ図の離散変数と連続変数を視覚化したいのですが、後者ではいくつかの極端に高い値があります。これにより、箱ひげ図が無意味になります(グラフのポイントと「ボディ」さえも小さすぎます)。そのため、これを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()
私の質問:誰もがラベルをこの 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軸ラベルの場合:
最も単純なのは、単に '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)
パッケージ構文の変更に関するコメントに2017年半ばに追加された注:
scale_y_continuous(formatter = 'log10')はscale_y_continuous(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))
実行後::
_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())
_
視覚化の前にデータを手動で変換することでようやく手に入れたと思います。
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に感謝!