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")
breaks=
にscale=
引数とscale_x_continuous
引数を指定することで、スケールの区切りとラベルを明示的に指定できることを知っています。
ただし、私は多くの質問と12のクロスブレークを含む調査データを処理しているので、これを自動的に行う方法を見つける必要があります。
ブレークとラベルを自動的に計算するようにggplot
に指示する方法はありますが、最小値、最大値、ゼロ点などは少なくなりますか?
編集:理想的には、最小点と最大点を指定するのではなく、何らかの方法で組み込みのスケールのggplotトレーニングを利用して、デフォルトの計算されたスケール制限を使用します。
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軸のテキストを回転し、次のようなものを生成します。
更新
最新バージョンの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))
_
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
関数では、削除する値を指定する必要がありますが、最大値と最小値を削除するようにこれらを簡単に変更して、指定された値を削除することができます範囲など.