¿Hay alguna forma de manipular los saltos de escala y las tags de ggplot?

ggplot generalmente hace un buen trabajo al crear ggplot y tags sensibles en escalas.

Sin embargo, me parece que en la ttwig con muchas facetas y tal vez una instrucción formatter= , las tags tienden a ser demasiado “densas” y sobreimprimir, por ejemplo en esta imagen:

 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

Sé que puedo especificar las roturas y las tags de las escalas de forma explícita, proporcionando breaks= y scale= arguments a scale_x_continuous .

Sin embargo, estoy procesando datos de encuestas con muchas preguntas y una docena de cruces, así que necesito encontrar una manera de hacerlo automáticamente.

¿Hay alguna manera de decirle a ggplot que calcule las pausas y las tags automáticamente, pero solo tiene menos, digamos como mínimo, máximo y cero?

EDITAR: Idealmente, no quiero especificar los puntos mínimo y máximo, pero de alguna manera aprovechar el entrenamiento de ggplot incorporado en las escalas, y usar los límites de escala calculados por defecto.

Puede pasar argumentos como min() y max() en su llamada a ggplot para especificar dinámicamente los saltos. Parece que va a aplicar esto en una amplia variedad de datos, por lo que es posible que desee considerar la generalización de esta función y el formato, pero este enfoque debería funcionar:

 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 = "")) ) 

o rotar el texto del eje x con opts(axis.text.x = theme_text(angle = 90, hjust = 0)) para producir algo como:

enter image description here

Actualizar

En la última versión de ggplot2, los argumentos de breaks y labels a scale_x_continuous aceptan funciones, por lo que uno puede hacer algo como lo siguiente:

 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))