29

新しいバージョンの ggplot2 とスケールでは、科学表記法で軸ラベルを取得する方法がわかりません。例えば:

x <- 1:4
y <- c(0, 0.0001, 0.0002, 0.0003)

dd <- data.frame(x, y)

ggplot(dd, aes(x, y)) + geom_point()

私にくれます

スケール付きの ggplot の例

軸ラベルを 0、5 x 10^-5、1 x 10^-4、1.5 x 10^-4 などにしたいのですが、scale_y_continuous()andの正しい組み合わせがわかりませんmath_format()(少なくともそれらは私が必要なものです)。

scale_y_log10()log は軸を変換しますが、これは望ましくありません。scale_y_continuous(label = math_format())10 ^ 0、10 ^ 5e-5などを与えるだけです。後者がその結果を与える理由はわかりますが、それは私が探しているものではありません。

私はggplot2_0.9.1とscales_0.2.1を使用しています

4

7 に答える 7

47

私はブライアンの答えを採用しました。私はあなたが求めているものを得たと思います。

Scientific_10() 関数に parse() を追加するだけで (そして「x」を正しい「時」記号に変更することで)、次のようになります。

x <- 1:4
y <- c(0, 0.0001, 0.0002, 0.0003)

dd <- data.frame(x, y)

scientific_10 <- function(x) {
  parse(text=gsub("e", " %*% 10^", scales::scientific_format()(x)))
}

ggplot(dd, aes(x, y)) + geom_point()+scale_y_continuous(label=scientific_10)

ここに画像の説明を入力

0 をもう少しエレガントに処理できるように関数をスマート化する必要があるかもしれませんが、それだけだと思います。

于 2013-08-30T10:20:24.663 に答える
13
scale_y_continuous(label=scientific_format())

10の代わりにeのラベルを付けます。

ここに画像の説明を入力してください

本当に10が必要な場合は、それを別の関数でラップできます。

scientific_10 <- function(x) {
  gsub("e", " x 10^", scientific_format()(x))
}

ggplot(dd, aes(x, y)) + geom_point() + 
  scale_y_continuous(label=scientific_10)

ここに画像の説明を入力してください

于 2012-05-25T23:23:15.100 に答える
10

上記のトムの答えを盗んで、以下は + 記号を削除し、0 をより適切に処理します (関数も匿名でインライン化されます)。

scale_y_continuous(label= function(x) {ifelse(x==0, "0", parse(text=gsub("[+]", "", gsub("e", " %*% 10^", scientific_format()(x)))))} ) +
于 2017-08-24T16:49:57.000 に答える
6

scales パッケージを回避する Scientific_10 のバージョンを作成しました。また、指数の先行ゼロも削除します (10^04 から 10^4 など)。これは、上記の役立​​つ回答から改作されました。

以下のラッパースケール関数も含めました。

scientific_10 <- function(x) {
    xout <- gsub("1e", "10^{", format(x),fixed=TRUE)
    xout <- gsub("{-0", "{-", xout,fixed=TRUE)
    xout <- gsub("{+", "{", xout,fixed=TRUE)
    xout <- gsub("{0", "{", xout,fixed=TRUE)
    xout <- paste(xout,"}",sep="")
    return(parse(text=xout))
}

scale_x_log10nice <- function(name=NULL,omag=seq(-10,20),...) {
    breaks10 <- 10^omag
    scale_x_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...)
}

scale_y_log10nice <- function(name=NULL,omag=seq(-10,20),...) {
    breaks10 <- 10^omag
    scale_y_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...)
}

scale_loglog <- function(...) {
    list(scale_x_log10nice(...),scale_y_log10nice(...))
}

qplot(x=exp(5*rnorm(100)),geom="density",kernel="rectangular") + 
    scale_x_log10nice()
于 2015-05-22T19:27:07.283 に答える