48

ggplot2を使用して、log10xスケールを逆にしてプロットを作成したいと思います。

require(ggplot2)
df <- data.frame(x=1:10, y=runif(10))
p <- ggplot(data=df, aes(x=x, y=y)) + geom_point() 

ただし、 log10スケールまたは逆スケールのいずれかを使用できるようです。

p + scale_x_reverse() + scale_x_log10() 

log10スケール、ただし反転しない

p + scale_x_reverse()

スケールを逆にしましたが、log10ではありません

レイヤーが1つのスケールしか持てない場合、これは論理的だと思います。そして確かに私は自分でデータフレームに対して対数変換を行うことでそれをハックすることができましたdf$xLog <- log10(df$x) が、その解決策はggplotの精神に反しているようです。ggplot呼び出しの外部でデータ変換を行わずにこの種のプロットを取得する方法はありますか?

4

3 に答える 3

63

@joranが彼のコメントで与えたリンクは正しい考えを与えます(あなた自身の変換を構築する)が、現在使用している新しいscalesパッケージに関しては時代遅れggplot2です。ガイダンスとインスピレーションを得るためにスケールパッケージを見て、log_transその中で、次の機能を作成できます。reverse_transreverselog_trans

library("scales")
reverselog_trans <- function(base = exp(1)) {
    trans <- function(x) -log(x, base)
    inv <- function(x) base^(-x)
    trans_new(paste0("reverselog-", format(base)), trans, inv, 
              log_breaks(base = base), 
              domain = c(1e-100, Inf))
}

これは、次のように簡単に使用できます。

p + scale_x_continuous(trans=reverselog_trans(10))

これはプロットを与えます:

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

わずかに異なるデータセットを使用して、軸が確実に反転していることを示します。

DF <- data.frame(x=1:10,  y=1:10)
ggplot(DF, aes(x=x,y=y)) + 
  geom_point() +
  scale_x_continuous(trans=reverselog_trans(10))

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

于 2012-06-15T16:32:47.130 に答える
10

ggforceパッケージにはtrans_reverser()このタスクのための機能があります。

library(ggplot2)
library(ggforce)

p <- ggplot() +
  geom_line(aes(x = 1:100, y = 1:100))

p +
  scale_x_continuous(trans = trans_reverser('log10')) +
  annotation_logticks(sides = 'tb') +
  theme_bw()

reprexパッケージ(v0.3.0)によって2020-11-14に作成されました

于 2020-11-15T00:26:25.863 に答える
2

aes()仕様では、ggplot関数内で直接対数を適用できます。

require(ggplot2)
df <- data.frame(x=1:10, y=runif(10))
p <- ggplot(data=df, aes(x = log10(x), y=y)) + geom_point() 

次にx軸を反転します

p + scale_x_reverse()

このようにしてデータは変更されませんが、グラフを拡大縮小できます

于 2021-10-30T22:26:16.870 に答える