2011-10-20 6 views
6

Sto usando ggplot2 per tracciare uno scatterplot di molti valori su un asse polare - coord_polar(). Il grafico risultante ha un testo affollato perché il testo è sempre allineato alla parte inferiore della pagina. È possibile posizionare il testo in modo che sia stampato radialmente lungo l'asse x polare?ruota il testo dell'asse x in ggplot2 quando si utilizza coord_polar()

A cura di fornire un esempio:

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

Nel caso presidenziale mi piacerebbe vedere i nomi presidenziali angolati per allineare con l'asse/parlato si trovano. Di seguito è riportato un esempio del grafico su cui sto lavorando dove l'asse x è categoriale e l'asse y è una variabile continua (simile all'esempio).

enter image description here

+0

è possibile fornire riproducibili esempio? – MYaseen208

+1

Dato che 'theme_text (angle =)' supporta solo un valore, la strada da percorrere è eliminare le etichette degli assi e usare geom_text calcolando gli angoli da soli. O forse modificando la sorgente per accettare più angolazioni. Ma lo lascio a qualcuno più esperto nelle budella di ggplot2. –

+0

'qplot (data = presidenziale, nome, fine) + coord_polar() + opts (axis.text.x = theme_text (angolo = 360/8 * seq_along (nome $ presidenziale)))' dà avvertimenti, ma utilizza ancora più angoli . – baptiste

risposta

4

ecco un non elegante esempio del punto:

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

Capisco che questo è un argomento vecchio, ma ho trovato una soluzione migliore per questo problema, ispirato dal commento di baptise:

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 risposta di Yoplait aiuta molto, ma ancora non risolve il problema di dover leggere sottosopra a metà del grafico. Un'estensione dell'idea che questo poster propone è la seguente.

prima cosa preparate il vettore inclinata, assicurandoti che abbiamo diviso il grafico in due:

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) 

e ora possiamo aggiungere i vettori angolo per fare il grafico attuale:

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