R 将文本距离输出添加到ggplot2 geom_step()函数

R 将文本距离输出添加到ggplot2 geom_step()函数,r,ggplot2,R,Ggplot2,有没有办法添加一个文本输出,动态显示geom_step创建的段的长度?我想出了如何添加列来显示下面的垂直和水平距离 ex <- structure(list(Type = c("A", "A", "A", "B", "B", "C", "C", "C" ), Hz = c(50, 550, 1050, 800, 300, 50, 550, 1050), Vert = c(500, 500, 550, 600, 600, 700, 750, 700)), row.names = c(NA,

有没有办法添加一个文本输出,动态显示geom_step创建的段的长度?我想出了如何添加列来显示下面的垂直和水平距离

ex <- structure(list(Type = c("A", "A", "A", "B", "B", "C", "C", "C"
), Hz = c(50, 550, 1050, 800, 300, 50, 550, 1050), Vert = c(500, 
500, 550, 600, 600, 700, 750, 700)), row.names = c(NA, 8L), class = "data.frame")


ex <- ex %>% arrange(Hz) %>%
  mutate(HzText= abs(Hz - lag(Hz, default = first(Hz)))) %>%
  arrange(Hz)%>%mutate(VtText= abs(Vert - lag(Vert, default = first(Vert)))) %>%
  mutate(HzMidpt= abs(Hz - lag(Hz, default = first(Hz)))/2+lag(Hz, default = first(Hz)))%>%
  mutate(VtMidpt= abs(Vert - lag(Vert, default = first(Vert)))/2+lag(Vert, default = first(Vert)))

ggplot(ex, aes(Hz,Vert, color=Type,group=1))+geom_step(color='black')+geom_point(size=5)+theme_minimal()+scale_y_reverse()+
  annotate("text",x=44,y=550,label='100',angle=90)+
  annotate("text",x=44,y=650,label='100',angle=90)+
  annotate("text",x=160,y=695,label='250')+
  annotate("text",x=300,y=650,label='100',angle=90)

ex%
突变(HzText=abs(赫兹-滞后(赫兹,默认值=first(赫兹)))%>%
排列(赫兹)%%>%变异(VtText=abs(垂直-滞后(垂直,默认值=first(垂直)))%%>%
突变(HzMidpt=abs(赫兹-滞后(赫兹,默认值=第一个(赫兹)))/2+滞后(赫兹,默认值=第一个(赫兹)))%>%
变异(VtMidpt=abs(Vert-lag(Vert,default=first(Vert)))/2+lag(Vert,default=first(Vert)))
ggplot(ex,aes(Hz,Vert,color=Type,group=1))+geom_阶跃(color='black')+geom_点(size=5)+最小主题()+比例y_反向()+
注释(“文本”,x=44,y=550,标签=100',角度=90)+
注释(“文本”,x=44,y=650,标签=100',角度=90)+
注释(“文本”,x=160,y=695,标签='250')+
注释(“文本”,x=300,y=650,标签=100',角度=90)

谢谢

我将重命名这些列以避免混淆:

库(dplyr)
图书馆(tidyr)
ex%
变异(
prev_x=滞后(x,默认值=第一个(x)),
上一个y=滞后(y,默认值=第一个(y)),
shift_x=x-上一个,
移位y=y-上一个
) %>% 
再长一点(
cols=匹配项(“移位”),
name_to=“direction”,
名称\u前缀=“移位”
) %>% 
过滤器(值!=0)%>%
变异(
label_x=案例(
方向==“x”~(x+上一个x)/2,
方向==“y”~x
),
标签y=案例(
方向==“x”~上一个方向,
方向==“y”~y-值/2
)    
) %>% 
变异(label_text=as.character(abs(value)))%>%
变异(角度=if_else(方向==“x”,0,90))
标签
#>#tibble:11 x 11
#>键入x y上一个x上一个y方向值标签x标签y
#>                      
#>1 C 50 700 50 500 y 200 50 600
#>2 B 300 600 50 700 x 250 175 700
#>3 B 300 600 50 700 y-100 300 650
#>4 A 550 500 300 600 x 250 425 600
#>5 A 550 500 300 600 y-100 550 550
#>6 C 550 750 500 y 250 550 625
#>7 B 800 600 550 750 x 250 675 750
#>8 B 800 600 550 750 y-150 800 675
#>9 A 1050550800600x250925600
#>10 A 1050 550 800 600 y-50 1050 575
#>11 C 1050 700 1050 550 y 150 1050 625
#> # ... 还有两个变量:标签文本、角度
现在,我们可以使用此数据框将标签添加到带有
geom_text
的绘图中

ggplot(ex,aes(x,y,color=type,group=1))+
几何点(尺寸=5)+
几何步(颜色=“黑色”)+
几何图形文本(数据=标签df,aes(标签x,标签y,标签=标签文本,角度=角度),
color=“gray30”)+
坐标固定()
主题_极小值()

这实际上是可以改进的。例如,考虑最右边的两点。从水平线到蓝点标记100个垂直偏移比从红点到蓝点标记150个垂直偏移更有意义。图中的这些位置可以描述为:

  • 移位是垂直的(
    方向==“y”
  • 之前的转变也是垂直的
  • 上一个班次的符号相反
这可以通过以下方式解决:

标签\u df%
变异(固定y标签=方向==“y”和滞后(方向==“y”和
符号(值)!=符号(滞后(值))&行数()!=1)%>%
变异(
label_y=ifelse(fix_y_label,label_y-lag(value)/2,label_y),
label_text=ifelse(固定标签,如.character(abs(value+lag(value))),label_text)
)
注意:仅当初始数据帧按x然后按y排序时,这才涵盖所有情况。(
排列(x,y)


这是一个非常快速的尝试,使用您计算的mids、g+geom_标签(data=ex[-1,])、aes(x=HzMidpt,y=VtMidpt,label=paste(HzText,VtText,sep=“,”)、col=“black”),我认为您必须考虑将标签放在何处,而不是我想要的。我只想把线段长度显示为除了线段线之外的文本。嗯,我不太明白你需要什么。。也许有一个例子?我已经更新了代码,以手动呈现我想要的打印标签。谢谢更新。我喜欢你的工作流程。我一直在尝试对geom_步骤进行反向工程,以获得类似的输出。