2015-08-20 12 views
5

Ho un grafico a dispersione con una linea orizzontale e una verticale, che rappresentano valori di soglia e pertanto dividono la trama in quattro quadranti. Mi piacerebbe etichettare i quadranti. Penso che il modo migliore per farlo sarebbe un numero in ciascuno dei quattro angoli del grafico (i suggerimenti alternativi sono ben accetti!).Posiziona il testo ggplot in ogni angolo

Sono riuscito a mettere un testo nell'angolo di ogni quadrante, ma le posizioni non sono perfette. Presumo che il problema abbia a che fare con il fatto che il ridimensionamento degli assi è diverso (l'intervallo di valori è all'incirca lo stesso, ma la larghezza della mia figura è circa tre volte l'altezza).

Attualmente procedo nel seguente modo. Per prima cosa creo il grafico con i punti e le due linee, poi lo costruisco per ottenere l'intervallo dei due assi, che uso per regolare la posizione dei testi.

plot.build = ggplot_build(plot) 

xpos = numeric(4) 
xpos[2] = xpos[3] = plot.build$panel$ranges[[1]]$x.range[1] 
xpos[1] = xpos[4] = plot.build$panel$ranges[[1]]$x.range[2] 

ypos = numeric(4) 
ypos[1] = ypos[2] = plot.build$panel$ranges[[1]]$y.range[2] 
ypos[3] = ypos[4] = plot.build$panel$ranges[[1]]$y.range[1] 


plot = plot + geom_text(aes(x2,y2,label = texthere), 
        data.frame(x2=xpos, y2=ypos, texthere=c("1", "2", "3", "4")), 
        color="#4daf4a", size=4) 

Fondamentalmente questo funziona, ma a causa della scala lo spazio tra i numeri ei bordi della trama non sono uguali per entrambi gli assi. Ho provato a regolare la posizione x del testo, ma poi ggplot espande semplicemente l'intervallo di valori, le posizioni (relative ai bordi) rimangono le stesse. C'è un modo per spostare il testo senza modificare l'intervallo di valori?

Grazie in anticipo!

+0

Benvenuti a SO! Fornisci un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), con un set di dati e magari un'immagine del tuo output corrente che mostra cosa c'è di sbagliato – scoa

+0

Vorrei aggiungere un'immagine, ma non ho abbastanza punti reputazione per farlo. –

risposta

11

Questo esempio utilizza il Inf & -Inf valori per posizionare il testo agli angoli e poi hjust e vjust argomenti nella geom_text per posizionare il testo all'interno della trama. Utilizzare hjustvar e vjustvar per posizionarli ulteriormente all'interno o all'esterno del grafico.

Come già detto da @baptiste è meglio utilizzare un nuovo set di dati per le annotazioni

df <- data.frame(x2=rnorm(100),y2=rnorm(100));library(ggplot2) 

annotations <- data.frame(
     xpos = c(-Inf,-Inf,Inf,Inf), 
     ypos = c(-Inf, Inf,-Inf,Inf), 
     annotateText = c("Bottom Left (h0,v0)","Top Left (h0,v1)" 
         ,"Bottom Right h1,v0","Top Right h1,v1"), 
     hjustvar = c(0,0,1,1) , 
     vjustvar = c(0,1,0,1)) #<- adjust 


    ggplot(df, aes(x2, y2)) + geom_point()+ 
      geom_text(aes(x=xpos,y=ypos,hjust=hjustvar,vjust=vjustvar,label=annotateText)) 

Example of Text Annotations in Corner

Se volessimo modificare le posizioni di testo, avremmo regolare le posizioni orizzontali con hjustvar e le posizioni verticali con vjustvar.

# How To Adjust positions (away from corners) 
annotations$hjustvar<-c(0, -1.5, 1, 2.5) # higher values = right, lower values = left 
annotations$vjustvar<-c(0,1,0,1) # higher values = up, lower values = down 

ggplot(df, aes(x2, y2)) + geom_point()+ 
     geom_text(data = annotations, aes(x=xpos,y=ypos,hjust=hjustvar, 
              vjust=vjustvar,label=annotateText)) 

Height Adjustment away from Corners

Spero che questo funziona!

+0

Grazie per la tua risposta! Sfortunatamente funziona solo parzialmente. I due testi superiori sono stampati, i due inferiori non lo sono. Non dovrebbe essere anche tra 0 e 1, come pure? Ma ho ancora una domanda aggiuntiva: Mi piacerebbe fare un rientro uguale (assoluto) da entrambi gli assi. Come riesco a farlo con hjust e vjust? –

+0

h positivo = sinistra, hjust negativo = destra. vjust positive = down, vjust negative = up. la quantità di regolazione dipende dalla scala che si ha con le variabili per i dati effettivi. Quindi devi trovare qualcosa che si adatta a questo. – user2673238

+0

Attualmente utilizzo queste opzioni: hjustvar = c (1, 0, 0, 1) vjustvar = c (1, 1, 0, 0) text = c ("1", "2", "3" , "4") 1 (in alto a destra) e 2 (in alto a sinistra) sono stampati, 3 e 4 non lo sono. –

8

quando si aggiungono annotazioni, assicurarsi di fornire un nuovo set di dati o di utilizzare annotazioni, altrimenti più etichette verranno sovrapposte dando un aspetto frastagliato. Ecco un minimo cambiamento dall'altro risposta,

df <- data.frame(x2=rnorm(100),y2=rnorm(100)) 
library(ggplot2) 

annotations <- data.frame(
    xpos = c(-Inf,-Inf,Inf,Inf), 
    ypos = c(-Inf, Inf,-Inf,Inf), 
    annotateText = c("Text","tExt","teXt","texT"), 
    hjustvar = c(0,0,1,1) , 
    vjustvar = c(0,1.0,0,1)) 


    ggplot(df, aes(x2, y2)) + geom_point()+ 
    geom_text(data = annotations, aes(x=xpos,y=ypos,hjust=hjustvar, 
       vjust=vjustvar,label=annotateText)) 

enter image description here