2013-04-25 9 views
7

Ho trovato una funzionalità piuttosto confusa in ggplot durante il tentativo di annotare i segmenti su scala log10. Codice seguente produce la trama di seguito:L'annotazione del segmento sulla scala log10 funziona in modo diverso per la fine e l'inizio del segmento?

library(ggplot2) 
dat <- data.frame(x = x <- 1:1000, y = log(x)) 
ggplot(dat, aes(x = x, y = y)) + 
geom_line(size = 2) + scale_x_log10() + 
annotate("segment", x = 0, xend = log10(100), y = log(100), yend = log(100), linetype = 2) + 
annotate("segment", x = log10(100), xend = log10(100), y = 0, yend = log(100), linetype = 2) 

enter image description here

considerando che la presente è quello che sto dopo:

ggplot(dat, aes(x = x, y = y)) + 
geom_line(size = 2) + scale_x_log10() + 
annotate("segment", x = 0, xend = log10(100), y = log(100), yend = log(100), linetype = 2) + 
annotate("segment", x = 100, xend = log10(100), y = 0, yend = log(100), linetype = 2) 

enter image description here

In altre parole, devo log10 trasformare il punto finale del segmento sull'asse x, ma non l'inizio. Questo comportamento ha una spiegazione logica? Capisco che aes() does the transformations ... ma in questo caso, le trasformazioni sull'asse x dovrebbero essere uniformi (bene, log10), giusto?

sto lavorando:

R version 3.0.0 (2013-04-03) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
ggplot2_0.9.3.1 

risposta

1

trovato che questo è un problema di scales() (non solo per la scale_x_log10()) quando viene utilizzato con annotate() e xend valore è fornito (è already filled come problema W .Chang). In questo caso la trasformazione di xend viene eseguita solo in una direzione: il log10 del valore non viene rilevato ma viene calcolata la potenza.

scale_x_log10() opere senza problemi se, per esempio, è utilizzata nel "rect"annotate() e xmin, sono forniti xmax valori.

ggplot(dat,aes(x,y))+geom_line()+ 
    scale_x_log10()+ 
    annotate("rect",xmin=100,xmax=1000,ymin=log(10),ymax=log(200)) 

enter image description here

soluzione per questo problema sarebbe quella di utilizzare geom_segment() con data=NULL e tutti gli altri valori immessi all'interno del aes().

ggplot(dat, aes(x = x, y = y)) + 
    geom_line(size = 2) + scale_x_log10() + 
    geom_segment(data=NULL,aes(x = 100, xend = 100, y = 0, yend = log(100)), 
                  linetype = 2) 

enter image description here

Problemi correlati