2013-04-25 7 views
7

Ich habe ein ziemlich verwirrendes Feature in ggplot gefunden, als ich versuchte, Segmente auf Log10-Skala zu kommentieren. Folgender Code die Handlung unter:Segment Annotation auf Log10 Skala funktioniert unterschiedlich für das Ende und den Anfang des Segments?

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

Während dies ist, was ich bin nach:

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

Mit anderen Worten, ich muß log10 die Endpunkt-Transformation des Segments auf der x-Achse, aber nicht der Anfang. Hat dieses Verhalten eine logische Erklärung? Ich verstehe, dass aes() does the transformations ... aber in diesem Fall sollten Transformationen auf der x-Achse einheitlich sein (naja, log10), oder?

Ich arbeite an:

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

Antwort

1

gefunden, dass dies ein Fehler von scales() ist (nicht nur für den scale_x_log10()), wenn er mit annotate() und xend Wert verwendet wird, wird zur Verfügung gestellt (es ist already filled als Ausgabe von W .Chang). In diesem Fall wird die Transformation xend nur in einer Richtung durchgeführt - log10 des Wertes wird nicht genommen, aber Macht wird berechnet.

scale_x_log10() Arbeiten ohne Probleme, wenn zum Beispiel "rect" in annotate() verwendet wird und xmin werden xmax Werte zur Verfügung gestellt.

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

Abhilfe für dieses Problem in der aes() setzen geom_segment() mit data=NULL und alle anderen Werte zu verwenden wäre.

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