2013-04-23 8 views
5

Należy zanotować linię na wykresie log-lin. Jak sprawić, aby ciąg tekstowy (tutaj "0000000000") był równoległy do ​​linii, do której się przypisuje?Jak zrobić geom_text() równolegle do geom_segment() w skali log-lin?

require(ggplot2) 
require(scales) 
x=c(1:10) 
y=2^x 
data_line <- data.frame(x=3,xend=8,y=2^8,yend=2^9) 
line <- geom_segment(data=data_line,aes(x=x,xend=xend,y=y,yend=yend),color="blue") 
angle= atan((data_line$yend - data_line$y)/(data_line$xend - data_line$x))*(180/pi) 
text <- annotate("text",x=data_line$x,y=data_line$y,label="0000000000",angle=angle) 
qplot(x=x,y=y,geom="line") + line + text + scale_y_log10() 
+0

Wydaje się to bardzo trudne (nawet bez skali logarytmicznej), chyba że ustalenie proporcji, określając 'coord_fixed (współczynnik = )'. ** [Zajrzyj tutaj **] (https://groups.google.com/forum/?fromgroups=#!topic/ggplot2/1OgeP4YBoJo) – Arun

Odpowiedz

1

Rozwiązanie jest następujące

require(ggplot2) 
require(scales) 
coord_ratio = ((1+sqrt(5))/2)^-1 
data <- data.frame(x=c(1:10),y=10^(1:10)) 
line_coord <- data.frame(x=round(runif(5,1,5)), 
        y=round(runif(5,10^1,10^5)), 
        xend=round(runif(5,5,10)), 
        yend=round(runif(5,10^5,10^10))) 
line_draw <- geom_segment(data=line_coord,aes(x=x,y=y,xend=xend,yend=yend),color="blue") 
angle = atan((log10(line_coord$yend)*(coord_ratio)-log10(line_coord$y)*coord_ratio)/(line_coord$xend-line_coord$x))*(180/pi) 
text <- annotate("text",x=line_coord$x,y=line_coord$y,label="LLLLLLLLLL",angle=angle,hjust=-0.1,vjust=-0.5) 
qplot(data$x,data$y) + scale_y_log10() + coord_fixed(ratio=coord_ratio) + line_draw + text 

result: i.imgur.com/0JBGAiO.png

3

Oto jeden ze sposobów, aby to zrobić przy użyciu coord_fixed:

ratio <- .25/(256/5) # 256/5 is from (512-256)/(8-3) 
df1 <- data.frame(x = 1:10, y = 2^(1:10)) 
d <- data.frame(xmin=3, xmax=8, ymin=256, ymax=512, annotation="bla") 
ggplot() + geom_line(data = df1, aes(x=x, y=y)) + 
    geom_segment(data=d, aes(x=xmin, xend=xmax, y=ymin, yend=ymax)) + 
    geom_text(data = d, aes(x=4, y=256/5 * 4 + 512/5, 
    label=annotation, angle=atan2((ymax-ymin)*ratio, 
    (xmax-xmin)) * 180/pi), vjust=-0.5) + coord_fixed(ratio=ratio) 

enter image description here


dostać to skala logarytmiczna, wydaje się nieco bardziej skomplikowane:

ratio <- -log10(.25/(256/5)) # 256/5 is from (512-256)/(8-3) 
df1 <- data.frame(x = 1:10, y = 2^(1:10)) 
d <- data.frame(xmin=3, xmax=8, ymin=256, ymax=512, annotation="bla") 
ggplot() + geom_line(data = df1, aes(x=x, y=y)) + 
    geom_segment(data=d, aes(x=xmin, xend=xmax, y=ymin, yend=ymax)) + 
    geom_text(data = d, aes(x=4, y=256/5 * 4 + 512/5, 
    label=annotation, angle=log10(atan2((ymax-ymin)*ratio, 
    (xmax-xmin)) * 180/pi)), vjust=-0.5) + coord_fixed(ratio=ratio) + scale_y_log10() 

enter image description here

+1

Dziękuję za Twój wkład. Doprowadziło mnie to do właściwego rozwiązania. – ifett