6

ggplot2を使用すると、目盛りが少なすぎる場合があることがわかりましたscale_y_log10。任意のデータから自動的にプロットを生成しようとしていますが、明示的に指定せずに目盛りの数を増やす方法を探しています (データがどうなるか事前にわからないため)。たとえば、対数 y スケールで単純な散布図を作成する関数は次のとおりです。

example_plot <- function(x) {
  p <- ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10()
  p
}

多くの場合、これはうまく機能しますが、次のデータを使用すると

d <- structure(list(MW = c(89.09, 174.2, 147.13, 75.07, 131.17, 131.17, 146.19, 149.21, 165.19, 115.13, 181.19, 117.15), rel.Ki = c(2.91438577473767, 1, 1.07761254731238, 1.0475715900998, 0.960123906592881, 0.480428471483881,  1.50210548081627, 0.318457530434953, 0.458477212731015, 1.92246139937586,  0.604121577795352, 2.4111345825694)), .Names = c("MW", "rel.Ki"), class = "data.frame", row.names = c(1L, 6L, 11L, 16L, 21L, 26L, 31L, 36L, 41L, 47L, 54L, 59L))

それが生み出す

print(example_plot(d))

ここに画像の説明を入力

y 軸の 1 つの目盛りはあまり役に立ちません。自動ティック位置ピッキング機能を書き直す以外に、この状況を防ぐ方法はありますか?

4

2 に答える 2

8

私が読んだばかりの興味深い発見?continuous_scaleは、breaks引数が次のようになる可能性があることです。

1 つの引数 (スケールの限界を示す文字ベクトル) を指定して呼び出すと、表示するブレークを指定する文字ベクトルを返す関数。

したがって、一定数の休憩を保証するには、次のようにすることができます。

break_setter = function(lims) {
  return(seq(from=as.numeric(lims[1]), to=as.numeric(lims[2]), length.out=5))
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter)

明らかに、非常に単純なサンプル関数は、データの対数的性質にうまく適応していませんが、これにもう少しプログラム的にアプローチする方法を示しています。


を使用することもできますpretty。これは、いくつかの休憩の提案を受け取り、適切なラウンド番号を返します。使用する

break_setter = function(lims) {
    return(pretty(x = as.numeric(lims), n = 5))
}

次の結果が得られます。

ログブレイク

さらに良いことに、break_setter()return に適切な関数を任意nに設定し、デフォルトを 5 に設定することもできます。

break_setter = function(n = 5) {
   function(lims) {pretty(x = as.numeric(lims), n = n)}
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter())  ## 5 breaks as above

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter(20))
于 2013-08-28T05:54:34.670 に答える
2

プログラムで制限を設定できます。たとえば、提供されたデータを使用して、次のように関数の制限を定義できます。

example_plot <- function(x){
  # identify the range of data
  lims <- c(10^floor(log10(min(x$rel.Ki, na.rm=TRUE))), 
    10^ceiling(log10(max(x$rel.Ki, na.rm=TRUE))))
  # require ggplot2
  require('ggplot2')
  # create the plot
  p <- ggplot(data = x, aes(x = MW, y = rel.Ki)) + 
    geom_point() +
    scale_y_log10(limits = lims)
  p
}

print(example_plot(d))

次に、最も近い 10 年のティックを含むプロットを取得します。

プログラムで制限を設定する方法

次に、対数グリッドを追加する場合は、マリウスらのbreaksオプションを使用します。scale_y_log10()提案:

 example_plot <- function(x){
  # identify the range of data      
  lims <- c(10^floor(log10(min(x$rel.Ki, na.rm=TRUE))), 
            10^ceiling(log10(max(x$rel.Ki, na.rm=TRUE))))  
   # require ggplot2
  require('ggplot2')
  # create the plot
  p <- ggplot(data = x, aes(x = MW, y = rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks = pretty(x = lims, n = 5),
                  limits = lims) 
  p 
}

print(example_plot(d))

個人的には、少なくとも 1 桁の変動を示す対数プロットを好むので、このアプローチは確実に発生するのに役立ちます。

ここに画像の説明を入力

于 2013-08-28T05:35:41.753 に答える