2016-02-03 26 views
13

Ho un set di dati, in cui ogni punto di dati ha un valore x che è vincolato (rappresenta un'istanza reale di una variabile quantitativa), valore y che è arbitrario (esiste semplicemente per fornire una dimensione per diffondere il testo) e un'etichetta. I miei set di dati possono essere molto grandi e spesso c'è sovrapposizione di testo, anche quando provo a diffondere il più possibile i dati sull'asse y.ggrepel: Respingere il testo in una sola direzione e restituire i valori del testo respinto

Quindi, sto cercando di utilizzare il nuovo ggrepel. Tuttavia, sto cercando di mantenere le etichette di testo vincolate nella loro posizione x-value, pur consentendo loro di respingere l'una dall'altra nella direzione y.

Ad esempio, il codice seguente produce un grafico per 32 punti dati, in cui i valori x mostrano il numero di cilindri in un'automobile ei valori y sono determinati in modo casuale (non hanno significato se non fornire un secondo dimensione per scopi di stampa del testo). Senza usare ggrepel, v'è una significativa sovrapposizione nel testo:

library(ggrepel) 
library(ggplot2) 
set.seed(1) 
data = data.frame(x=runif(100, 1, 10),y=runif(100, 1, 10),label=paste0("label",seq(1:100))) 
origPlot <- ggplot(data) + 
    geom_point(aes(x, y), color = 'red') + 
    geom_text(aes(x, y, label = label)) + 
    theme_classic(base_size = 16) 

Original plot

posso rimediare la sovrapposizione testo utilizzando ggrepel, come mostrato sotto. Tuttavia, questo cambia non solo i valori y, ma anche i valori x. Sto cercando di evitare di modificare i valori x, in quanto rappresentano un significato fisico (il numero di cilindri):

repelPlot <- ggplot(data) + 
    geom_point(aes(x, y), color = 'red') + 
    geom_text_repel(aes(x, y, label = label)) + 
    theme_classic(base_size = 16) 

enter image description here

Come nota, il motivo non posso permettere il valore x del testo da modificare è perché sto solo tracciando il testo (non i punti). Mentre sembra che molti esempi in ggrepel mantengano la posizione dei punti (in modo che i loro valori rimangano veri) e respingano solo i valori xey delle etichette. Quindi, i punti e collegati alle etichette con segmenti (puoi vederlo nel mio secondo esempio di trama).

Ho mantenuto i punti nei due esempi sopra a scopo dimostrativo. Tuttavia, sto solo mantenendo il testo (e quindi sarà la rimozione dei punti e segmenti), lasciandomi con qualcosa di simile:

repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0) + theme_classic(base_size = 16) 

enter image description here

La mia domanda è duplice:

1) È possibile per me respingere le etichette di testo solo nella direzione y?

2) È possibile ottenere una struttura contenente i nuovi valori (respinti) y del testo?

Grazie per qualsiasi consiglio!

+0

Non capisco come risolvere il problema? Grazie. – luckButtered

risposta

4

ggrepel versione 0.6.8 (Installa da GitHub utilizzando devtools :: github_install) supporta ora un argomento "direzione", che consente di repellente di etichette solo in "x" o la direzione "y" .

repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0, direction = "y") + theme_classic(base_size = 16)

Ottenere i valori y è più difficile - un approccio può essere quello di utilizzare la funzione "repel_boxes" da ggrepel prima di ottenere valori respinti e quindi introdurre quelli in ggplot con geom_text. Per la discussione e il codice di esempio di tale approccio, vedere https://github.com/slowkow/ggrepel/issues/24. Si noti che se si utilizza la versione più recente, la funzione repel_boxes ora ha anche un argomento "direction", che accetta "both", "x" o "y".

5

Non credo sia possibile respingere le etichette di testo solo in una direzione con ggrepel.

Vorrei affrontare questo problema in modo diverso, generando invece manualmente le posizioni dell'asse y arbitrario. Ad esempio, per il set di dati nel tuo esempio, puoi farlo usando il codice qui sotto.

Ho utilizzato il pacchetto dplyr per raggruppare il set di dati con i valori di x e quindi creato una nuova colonna di dati contenente i numeri di riga all'interno di ciascun gruppo. I numeri di riga vengono quindi utilizzati come valori per l'asse y.

library(ggplot2) 
library(dplyr) 

data <- data.frame(x = mtcars$cyl, label = paste0("label", seq(1:32))) 

data <- data %>% 
    group_by(x) %>% 
    mutate(y = row_number()) 

ggplot(data, aes(x = x, y = y, label = label)) + 
    geom_text(size = 2) + 
    xlim(3.5, 8.5) + 
    theme_classic(base_size = 8) 

ggsave("filename.png", width = 4, height = 2) 

enter image description here

+0

Mi rendo conto che la mia domanda è inavvertitamente fuorviante. Nel mio set di dati reali, i valori x sono continui (non discreti, come ho fatto con il mio MWE). Quindi, quando applico la tua soluzione, non risolve il problema. Sto modificando il mio errore, e se non sento una soluzione alla mia (più chiara) domanda, selezionerò anche la tua risposta attuale. Grazie. – luckButtered

+0

In realtà ho applicato una soluzione simile, in origine, a quello che hai fatto. Tranne che ho raggruppato le etichette in contenitori con valori x simili. C'è ancora una sostanziale sovrapposizione in un set di dati con molte etichette, e cioè quando mi sono rivolto a ggrepel. – luckButtered