2012-12-15 23 views
4

請幫助我找到一種通用的方法來將文本放置在距離繪圖區右側不變的距離處,如下圖所示。由於右側的繪圖區域較窄,不幸的是,當前的放置計算將文本置於左側太遠。請注意,文本是右對齊的。我最後的想法是:如果我們知道x = 1和x = 2之間的距離,我們可以很容易地計算出位置。不幸的是,它顯然是not that easy得到這個距離。將文本放在離圖表固定的距離

僅供參考:我不打算標註這些行。

enter image description here Full-size image

library(ggplot2) 
library(reshape) 
library(gridExtra) 

df = data.frame(x =(1:3),One=c(12, 8, 13),Two=c(13, 7, 11),Three=c(11, 9, 11)) 
df.melt = melt(df, id.vars="x") 
xmax = max(df.melt$x); xmin = min(df.melt$x) 
ymax = max(df.melt$value); ymin = min(df.melt$value) 

dfa = data.frame(x=(xmax-xmin)*1.15+xmin, y=c(11,12,13.5), ann=c("10.1|","1.1|","Texttexttext|")) 
dfa.melt = melt(dfa, id.vars=c("x","ann")) 

p = ggplot() + 
    geom_line(data=df.melt, aes(x=x, y=value, color=variable), show_guide=F) + 
    geom_text(data=dfa.melt, aes(x=x, y=value, hjust = 1, label=ann), size=3) + 
    coord_cartesian(xlim=c(xmin,xmax), ylim=c(ymin,ymax)) 

p1 = p + theme(plot.margin=unit(c(1,3,0,0),"cm"), axis.text.y=element_text(size=10)) 
p2 = p + theme(plot.margin=unit(c(1,3,0,3),"cm"), axis.text.y=element_text(size=35)) 
p1c <- ggplot_gtable(ggplot_build(p1)) 
p1c$layout$clip[p1c$layout$name=="panel"] <- "off" 
p2c <- ggplot_gtable(ggplot_build(p2)) 
p2c$layout$clip[p2c$layout$name=="panel"] <- "off" 
grid.arrange(p1c, p2c, ncol=2) 

回答

3

因爲一切都被命名,也可以訪問 使用 電網功能情節的任何部件。

問題是ggplot2繪製圖時會創建許多視口和grobs。所以要改變這個情節並不容易。 我還注意到,對於劇情的每個新執行,grobs和視口的名稱都會發生更改。所以,我想通過一些標準,以獲得視口(此處深度= 4)

#Get the viewports: 
scene.vps <- grid.ls(viewports=T,grobs=F) 
scene.flat <- as.data.frame(do.call('cbind',scene.vps)) 
vps <- subset(scene.flat ,vpDepth == '4')$name[1:2] 
vps <- as.character(vps) 


# modify the plot by grid.text 
depth <- downViewport(vps[1]) 
grid.text("1.1|",x=unit(1, "npc") - unit(1, "mm"), 
       y=unit(1, "npc") - unit(20, "mm"), 
       just=c("right", "top")) 

grid.text("10.1|",x=unit(1, "npc") - unit(1, "mm"), 
        y=unit(1, "npc") - unit(60, "mm"), 
        just=c("right", "top")) 

grid.text("Texttexttext|",x=unit(1, "npc") - unit(10, "mm"), 
          y=unit(1, "npc") -unit(2,'mm'), 
      just=c("right", "top")) 

upViewport(depth) # come back to the root viewport 

depth <- downViewport(vps[2]) 

grid.text(... 

enter image description here

+0

感謝。我想你的答案是從網格的最右側邊界到劇情的右側。見[這裏](http://i.stack.imgur.com/Uknt7.png)。另外,將文本定位在特定的y值處有點困難。在我的例子中,文本被精確地放置在'y = 11'和'y = 12'處。 –

+0

@Frank是從正確的是。這是參考的問題。你需要在y = 11,12處放置文本嗎? – agstudy

+0

是的,如果y位置與圖表座標相關將會很好。無論如何,解決我的另一個問題[(LINK)](http://stackoverflow.com/questions/13867325/get-width-of-plot-area-in-ggplot2),它應該是可能的。明年將完成我的申請。感謝您對這兩個問題的幫助! –