superponer - ¿Hay alguna forma de manipular los saltos de escala y las etiquetas de ggplot?
superponer graficas en r ggplot (1)
ggplot
generalmente hace un buen trabajo al crear ggplot
y etiquetas sensibles en escalas.
Sin embargo, me parece que en la trama con muchas facetas y tal vez una instrucción formatter=
, las etiquetas 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")
Sé que puedo especificar las roturas y las etiquetas 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 etiquetas 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:
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))