ggplotで軸の数値の書式を変更するにはどうすればよいですか?


131

私はRとggplotを使用していくつかのデータの散布図を描画していますが、y軸の数値がコンピュータースタイルの指数形式、つまり4e + 05、5e + 05などで出力されることを除いて、すべて問題ありません。これは明らかに許容できないので、50万、40万などとして表示するようにします。適切な指数表記を取得することも可能です。

プロットのコードは次のとおりです。

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

どんな助けも大歓迎です。


30
ggplotデフォルトのオプションを「明らかに許容できない」ものとして説明する場合は注意してください。あなたが持っている意味個人的な好みは異なるフォーマットのために。フォーマット内の数値4e+05は科学表記法であり、さまざまなアプリケーションで推奨されるフォーマットです。
アンドリー

53
4e + 05は科学表記ではありません。科学表記にコンピューターで近似したものです。私が考えることができるどの印刷雑誌でもそれは受け入れられないでしょう、それで私はそれを私の論文のために受け入れられないと見なします。
Jack Aidley、

回答:


126

別のオプションは、コンマを使用して軸目盛りラベルをフォーマットすることで、パッケージを使用してscales追加します

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

あなたのggplotステートメントに。

パッケージをロードしたくない場合は、次を使用します。

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

9
そのような些細な問題が新しいパッケージをロードすることを要求することは驚くべきことです。
luchonacho 2017

参考までに、これはscale_y_log10(labels = scales :: comma)でも機能し、ggplot2の他のスケールを想定しています。素晴らしいヒント!
TheProletariat 2017

66

また、軸に適切な 'x10(superscript)5'表記を与える別の方法を見つけました。一部のユーザーに役立つことを期待して、ここに投稿しています。私はここからコードを取得しので、それに対する信用はないと主張します。

fancy_scientific <- function(l) {
     # turn in to character string in scientific notation
     l <- format(l, scientific = TRUE)
     # quote the part before the exponent to keep all the digits
     l <- gsub("^(.*)e", "'\\1'e", l)
     # turn the 'e+' into plotmath format
     l <- gsub("e", "%*%10^", l)
     # return this as an expression
     parse(text=l)
}

その後、次のように使用できます

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 

10
あなたは下に以下を追加し、0は「0 X10⁺⁰」として印刷したくない場合はformat(...)行を:l <- gsub("0e\\+00","0",l)
半外因

1
他のものを特別なケースにしたい場合、別のコンソールでケースの戻り値をテストしながら、のgsub()直後にさらに追加するのが最も簡単です。format()format()
的な

3
最後の前にこれを追加gsubコマンド:# remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)それ後:# convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)通常の論文で使用される形式でそれを作るために。
John_West 2016

44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

これを試すと、フォーマッタが未使用の引数であるというエラーが発生しますか?別のパッケージが必要ですか?
Jack Aidley

4
私はコードをインクルードlibrary(scales)して使用するように変更しましたcomma。これは、以前の機能よりもうまく機能するはずです。
DiscreteCircle

16

私はここでゲームに遅れましたが、他の人が簡単な解決策を望んでいる場合、私は次のように呼び出すことができる関数のセットを作成しました:

 ggplot + scale_x_continuous(labels = human_gbp)

これにより、x軸またはy軸の人間が読める数値(または実際には任意の数値)が得られます。

関数はここにあります:Github Repo 関数をスクリプトにコピーして、呼び出すことができます。


10

ジャック・エイドリーの提案された答えは役に立つものだと思います。

別の選択肢を捨てたかった。多数の小さな数値のシリーズがあり、軸ラベルが完全な小数点(たとえば、5e-05-> 0.0005)を書き出すことを保証したい場合は、次のようにします。

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy) 

23
これは無名関数を使用することで短縮できます。scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})なぜそのような事前定義されたフォーマッターがないのか、地獄は知っています。
eMPee584 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.