2011-10-20 178 views
6

Estoy usando ggplot2 para trazar un diagrama de dispersión de muchos valores en un eje polar - coord_polar(). El gráfico resultante tiene texto lleno porque el texto siempre está alineado con el final de la página. ¿Es posible colocar el texto de manera que se imprima radialmente a lo largo del eje x polar?rotar el texto del eje x en ggplot2 al usar coord_polar()

Editado para proporcionar un ejemplo:

qplot(data=presidential, name,end) + coord_polar() 

En el caso presidencial Me gustaría ver los nombres presidenciales en ángulo para alinearse con el eje/hablaron que están. A continuación se muestra un ejemplo del gráfico en el que estoy trabajando, donde el eje x es categórico y el eje y es una variable continua (similar al ejemplo).

enter image description here

+0

puede ofrecerle reproducibles ¿ejemplo? – MYaseen208

+1

Dado que 'theme_text (angle =)' solo admite un valor, el camino a seguir es deshacerse de las etiquetas de los ejes y usar geom_text calculando los ángulos usted mismo. O tal vez modificar la fuente para aceptar múltiples ángulos. Pero se lo dejo a alguien más conocedor de las agallas ggplot2. –

+0

'qplot (data = presidential, name, end) + coord_polar() + opts (axis.text.x = theme_text (angle = 360/8 * seq_along (presidential $ name)))' da advertencias, pero aún usa múltiples ángulos . – baptiste

Respuesta

4

aquí es un no ejemplo elegante de la coordenada:

CoordPolar2 <- proto(CoordPolar, { 
    objname <- "polar2" 
    guide_foreground <- function(., details, theme) { 
    theta <- .$theta_rescale(details$theta.major, details) 
    labels <- details$theta.labels 

    # Combine the two ends of the scale if they are close 
    theta <- theta[!is.na(theta)] 
    ends_apart <- (theta[length(theta)] - theta[1]) %% (2*pi) 
    if (ends_apart < 0.05) { 
     n <- length(labels) 
     if (is.expression(labels)) { 
     combined <- substitute(paste(a, "/", b), 
      list(a = labels[[1]], b = labels[[n]])) 
     } else { 
     combined <- paste(labels[1], labels[n], sep="/") 
     } 
     labels[[n]] <- combined 
     labels <- labels[-1] 
     theta <- theta[-1] 
    } 

    grobTree(
     if (length(labels) > 0) { 
     lab <- theme_render(
      theme, "axis.text.x", 
      labels, 0.45 * sin(theta) + 0.5, 0.45 * cos(theta) + 0.5, 
      hjust = 0.5, vjust = 0.5, 
      default.units="native" 
     ) 
     lab$rot <- (pi/2 - theta)/pi * 180 
     lab 
     }, 
     theme_render(theme, "panel.border") 
    ) 
    } 
}) 

coord_polar2 <- CoordPolar2$build_accessor() 

p <- qplot(data=presidential, name,end) + coord_polar2() 
print(p) 

enter image description here

9

Entiendo que esto es un viejo tema, pero he encontrado una mejor solución para este problema, inspirada del comentario del bautizo:

ggplot(data, aes(x=someId, y=someValue)) + 
    geom_point() + 
    coord_polar() + 
    theme(axis.text.x = element_text(
    angle= -90 - 360/length(unique(data$someId)) * seq_along(data$someId) 
    ) 
) 
4

La respuesta de Yoplait ayuda mucho, pero aún no resuelve el problema de tener que leer boca abajo en la mitad del gráfico. Una extensión de la idea que este poster propone es la siguiente.

En primer lugar preparar el vector de ángulo, asegurándose de que dividimos el gráfico en dos:

sequence_length = length(unique(data$someId)) 
first_sequence = c(1:(sequence_length%/%2)) 
second_sequence = c((sequence_length%/%2+1):sequence_length) 
first_angles = c(90 - 180/length(first_sequence) * first_sequence) 
second_angles = c(-90 - 180/length(second_sequence) * second_sequence) 

y ahora podemos añadir los vectores de ángulo para que el gráfico real:

ggplot(data, aes(x=someId, y=someValue)) + 
    geom_point() + 
    coord_polar() + 
    theme(axis.text.x = element_text(
    angle= c(first_angles,second_angles) 
    ) 
) 
Cuestiones relacionadas