2011-09-16 42 views
1

我公司生产双标图与此R代码:箭头标签方向在GGPLOT2

set.seed(12345) 
require(ggplot2) 
AData <- data.frame(Glabel=LETTERS[1:7], A=rnorm(7, mean = 0, sd = 1), B=rnorm(7, mean = 0, sd = 1)) 
TData <- data.frame(Tlabel=LETTERS[11:20], A=rnorm(10, mean = 0, sd = 1), B=rnorm(10, mean = 0, sd = 1)) 
i <- 2 
j <- 3 
p <- ggplot(data=AData, aes(AData[, i], AData[, j])) + geom_point() + theme_bw() 
p <- p + geom_text(aes(data=AData, label=Glabel), size=3, vjust=1.25, colour="black") 
p <- p + geom_segment(data = TData, aes(xend = TData[ ,i], yend=TData[ ,j]), 
       x=0, y=0, colour="black", 
       arrow=arrow(angle=25, length=unit(0.25, "cm"))) 
p <- p + geom_text(data=TData, aes(x=TData[ ,i], y=TData[ ,j], label=Tlabel), size=3, vjust=1.35, colour="black") 

输出 enter image description here

一切除箭头标签细。我想在箭头的结尾处标出标签,并且与箭头方向相同。任何想法和/或解决方案。提前致谢。

回答

5

两种可能性:

p <- p + geom_text(data=TData, aes(x=1.2*TData[ ,i], 
            y=1.2*TData[ ,j], 
        label=Tlabel), size=3, vjust=0, colour="black") 
p 
#----------------------------------- 
p <- p + geom_text(data=TData, aes(x=TData[ ,i] +.1*sign(TData[ ,i]), 
            y=TData[ ,j]+.1*sign(TData[ ,j]), 
        label=Tlabel), size=3, vjust=0, colour="black") 
p 

首先一个从箭头离开标签远,与“强度”变化的距离,而第二个上的图形绘制规模的固定距离(可能是优选的解决方案和一个在下面说明)。

Second version as image

最后完全“trigonometricized”版本,将在同一矢量的箭头正好得到的标签。 (符号的同一性()说法是约定反正切值的结果雅做什么雅GATTA做。):

p <- ggplot(data=AData, aes(AData[, i], AData[, j])) + geom_point() + theme_bw() 
p <- p + geom_text(aes(data=AData, label=Glabel), size=3, vjust=1.25, colour="black") 
p <- p + geom_segment(data = TData, aes(xend = TData[ ,i], yend=TData[ ,j]), 
       x=0, y=0, colour="black", 
       arrow=arrow(angle=25, length=unit(0.25, "cm"))) 
p <- p + geom_text(data=TData, 
      aes(x=TData[ ,i] +.1*cos(atan(TData[ ,j]/TData[ ,i]))*sign(TData[ ,i]), 
       y=TData[ ,j] +.1*sin(atan(TData[ ,j]/TData[ ,i]))*sign(TData[ ,i]), 
      label=Tlabel), size=3, vjust=0, colour="red") 
+0

请参阅我的回答 – MYaseen208

+0

'atan2'可能会更安全 – baptiste

1

任何解决方案都可能需要一些手动操作与定位。但最终在你的情况下,它会更容易稍微绘制标签没有vjust调整,然后缩短每个箭头:

#This is the ad-hoc part to tinker with 
l <- 1 - (0.05 * sqrt(1/with(TData,A^2 + B^2))) 

p <- ggplot(data=AData, aes(AData[, i], AData[, j])) + geom_point() + theme_bw() 
p <- p + geom_text(aes(data=AData, label=Glabel), size=3, vjust=1.25, colour="black") 

#Scale the segments back slightly 
p <- p + geom_segment(data = TData, aes(xend = TData[ ,i] * l, yend=TData[ ,j] * l), 
       x=0, y=0, colour="black", 
       arrow=arrow(angle=25, length=unit(0.25, "cm"))) 
p <- p + geom_text(data=TData, aes(x=TData[ ,i], y=TData[ ,j], label=Tlabel), size=3, colour="black") 

enter image description here

注段缩短了比例有所发生的因为箭头长度本身是固定的。

+0

在'gridExtra :: barbedGrob'中做了类似的计算,我猜应该得到一个'arrow'参数来做这种事情。 – baptiste

+0

@joran请参阅我的回答 – MYaseen208

1

与标签方向更好的解决方案为箭头:

set.seed(12345) 
require(ggplot2) 
AData <- data.frame(Glabel=LETTERS[1:7], A=rnorm(7, mean = 0, sd = 1), B=rnorm(7, mean = 0, sd = 1)) 
TData <- data.frame(Tlabel=LETTERS[11:20], A=rnorm(10, mean = 0, sd = 1), B=rnorm(10, mean = 0, sd = 1)) 
i <- 2 
j <- 3 
p <- ggplot(data=AData, aes(AData[, i], AData[, j])) + geom_point() + theme_bw() 
p <- p + geom_text(aes(data=AData, label=Glabel), size=3, vjust=1.25, colour="black") 

p <- p + geom_segment(data = TData, aes(xend = TData[ ,i], yend=TData[ ,j]), 
       x=0, y=0, colour="black", 
       arrow=arrow(angle=25, length=unit(0.25, "cm"))) 
p <- p + geom_text(
     data=TData 
     , aes(x=TData[ ,i], y=TData[ ,j], label=Tlabel 
      , angle = (180/pi) * atan(TData[ ,j]/TData[ ,i]) 
      , hjust = (1 - 2 * sign(TData[ ,i]))/2) 
     , size=3 
     , colour="black") 

print(p) 

enter image description here

+0

我很高兴您找到了更符合您喜好的解决方案。但个人而言,我发现字母离阅读方向的旋转非常糟糕,并且决不会自己做。 – joran