web-dev-qa-db-ja.com

ggplotのスケールブレークとラベルを操作する方法はありますか?

ggplotは、通常、目盛りに適切な区切りとラベルを作成するのに適しています。

ただし、多くのファセットとおそらくformatter=ステートメントのあるプロットでは、ラベルは「密」になりすぎてオーバープリントされる傾向があることがわかります。たとえば、次の図のようになります。

df <- data.frame(
        fac=rep(LETTERS[1:10], 100),
        x=rnorm(1000)
)

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(formatter="percent")

enter image description here

breaks=scale=引数とscale_x_continuous引数を指定することで、スケールの区切りとラベルを明示的に指定できることを知っています。

ただし、私は多くの質問と12のクロスブレークを含む調査データを処理しているので、これを自動的に行う方法を見つける必要があります。

ブレークとラベルを自動的に計算するようにggplotに指示する方法はありますが、最小値、最大値、ゼロ点などは少なくなりますか?

編集:理想的には、最小点と最大点を指定するのではなく、何らかの方法で組み込みのスケールのggplotトレーニングを利用して、デフォルトの計算されたスケール制限を使用します。

30
Andrie

Ggplotの呼び出しでmin()max()などの引数を渡して、ブレークを動的に指定できます。これをさまざまなデータに適用しようとしているように思われるので、これを関数に一般化してフォーマットをいじることを検討する必要があるかもしれませんが、このアプローチは機能するはずです。

_ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(breaks = c(min(df$x), 0, max(df$x))
    , labels = c(paste( 100 * round(min(df$x),2), "%", sep = ""), paste(0, "%", sep = ""), paste( 100 * round(max(df$x),2), "%", sep = ""))
    )
_

または、opts(axis.text.x = theme_text(angle = 90, hjust = 0))を使用してx軸のテキストを回転し、次のようなものを生成します。

enter image description here

更新

最新バージョンのggplot2では、_scale_x_continuous_のbreaksおよびlabels引数が関数を受け入れるため、次のようなことができます。

_myBreaks <- function(x){
    breaks <- c(min(x),median(x),max(x))
    names(breaks) <- attr(breaks,"labels")
    breaks
}

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(breaks = myBreaks,labels = percent_format()) + 
  opts(axis.text.x = theme_text(angle = 90, hjust = 1,size = 5))
_
26
Chase

scalesパッケージには、ggplotで使用される関数(クロージャー)を返すbreaks_*およびlabel_*関数がいくつか含まれています。したがって、出力を変更するこれらのラッパーを作成できます。

例えば:

library(ggplot2)

# Compute the list of breaks using original_func,
# then remove any of these that occur in remove_list
remove_breaks <- function(original_func, remove_list = list()) {
  function(x) {
    original_result <- original_func(x)
    original_result[!(original_result %in% remove_list)]
  }
}

# Compute the list of labels using original_func,
# then remove any of these that occur in remove_list
remove_labels <- function(original_func, remove_list = list()) {
  function(x) {
    original_result <- original_func(x)
    replace(original_result, original_result %in% remove_list, '')
  }
}

# Original plot
ggplot(data.frame(x=c(1,2,3,4,5,6,7,8), y = c(1,4,9,16,25,36,49,64))) + geom_line(aes(x, y)) +
  scale_x_continuous(breaks       = scales::breaks_pretty(9),
                     minor_breaks = scales::breaks_pretty(18),
                     labels       = scales::label_number_auto()) +
  scale_y_continuous(breaks       = scales::breaks_pretty(9),
                     minor_breaks = scales::breaks_pretty(18),
                     labels       = scales::label_number_auto())

# Remove some breaks from the x-axis, and remove some labels from the y-axis
ggplot(data.frame(x=c(1,2,3,4,5,6,7,8), y = c(1,4,9,16,25,36,49,64))) + geom_line(aes(x, y)) +
  scale_x_continuous(breaks       = remove_breaks(scales::breaks_pretty(9), seq(3,6)),
                     minor_breaks = remove_breaks(scales::breaks_pretty(18), seq(3,6,0.5)),
                     labels       = scales::label_number_auto()) +
  scale_y_continuous(breaks       = scales::breaks_pretty(9),
                     minor_breaks = scales::breaks_pretty(18),
                     labels       = remove_labels(scales::label_number_auto(), seq(20, 30)))

もちろん、私の単純なremove_breaks関数とremove_labels関数では、削除する値を指定する必要がありますが、最大値と最小値を削除するようにこれらを簡単に変更して、指定された値を削除することができます範囲など.

0
Tim Goodman