ggplot2 添加指向特定数据点的动态箭头注释,这些数据点与整个图的比例保持比例

ggplot2 adding dynamic arrow annotations pointing at specific data points that remain proportional to the scale of the overall plot

我想创建一个模板,允许我创建一个股票价格折线图,并能够添加指向特定日期的箭头。 ggplot2 上的注释功能不允许根据绘图的比例调整大小。有什么解决方法吗?

例如,在这个只有 6 个日期的图中,箭头的大小与图表相匹配:

prices<-c(3,5,28,17,62,10)
prices2<-prices-1
prices3<-prices-11
dates<-seq.Date(from=as.Date("2018-1-1"),to=as.Date("2018-1-6"),"days")

ggplot()+
geom_line(aes(dates,prices))+
annotate(
"segment",
x=dates,
xend=dates,
y=prices3,
yend=prices2,
color="blue",
arrow=arrow(length=unit(0.5,"cm")
            ))

然而,当我将周期增加到 15 个日期时,箭头不按比例缩放,看起来像这样:

我不确定你所说的比例到底是什么意思,它与第一个数字的比例长度基本相同吗?如果是这样,由于箭头的长度由 prices2prices3 控制,您可以计算出它们在第一个数字上按比例占多少 space,然后计算第二个数字。结合 npc 作为箭头,它应该大致给你你想要的。由于 x 轴的原因,箭头本身并不完美,但我认为它比您之前的更接近。

因此使用您的数据:

# original data
prices<-c(3,5,28,17,62,10)
dates<-seq.Date(from=as.Date("2018-1-1"),to=as.Date("2018-1-6"),"days")

# original plot (with 0.05 npc)
ggplot()+
    geom_line(aes(dates,prices))+
    annotate(
        "segment",
        x=dates,
        xend=dates,
        y=prices-11,
        yend=prices-1,
        color="blue",
        arrow=arrow(length=unit(0.05,"npc")
        ))

# new data
prices2<-c(prices,c(20,250,30,60,40))
dates2 <- seq.Date(from=as.Date("2018-1-1"),to=as.Date("2018-1-11"),"days")

# compute length of arrow
p1 <- abs(min(prices)-11)+max(prices)
fs1<-function(x) { (abs(min(prices2)-x)+max(prices2))*11/p1-x }
y1<-uniroot(fs2,lower=0,upper=100)$root

p2 <- abs(min(prices)-1)+max(prices)
fs2<-function(x) { (abs(min(prices2)-x)+max(prices2))*1/p2-x }
y2<-uniroot(fs1,lower=0,upper=100)$root

# new plot
ggplot()+
geom_line(aes(dates2,prices2))+
annotate(
    "segment",
    x=dates2,
    xend=dates2,
    y=prices2-y1,
    yend=prices2-y2,
    color="blue",
    arrow=arrow(length=unit(0.05,"npc")
    ))