我想在x-y坐标中绘制时间角度序列。当两个邻居之间的差异小于180时,它们将直接排成一行。否则,一个将与360内衬,而另一个将与0内衬,这意味着路径越过了0/360点。 我知道的是先计算两个插值点,然后绘制两个线段,是否有一些聪明的直接方法?
library(ggplot2)
data<-data.frame(time=c(1,2,3,4),angle=c(200,100,320,20))
#ggplot()+geom_line(data,aes(time,angle))
#three lines codes is expected,but now it is->
ymax=360
ymin=0
ythd=(ymax-ymin)/2 #180
j=1 #left end point number
n=nrow(data)# rignt end point number
aid=data[1,] #aids line from end point to border
gg=ggplot()
for(i in 1:(n-1)){
delta=data[i+1,2]-data[i,2]
#divide groups
if(abs(delta)>ythd){
gg=gg+geom_line(data=data[j:i,],aes(time,angle))
j=i+1
fst=data[i,2]
stp=data[j,1]-data[i,1]
aid[1,]=data[i,]
#interpolating points
if(delta>0){
rto=fst/(360-(delta))
aid[2:3,1]=data[i,1]+rto*stp
aid[2,2]=ymin
aid[3,2]=ymax
}else{
rto=(360-fst)/(360+delta)
aid[2:3,1]=data[i,1]+rto*stp
aid[2,2]=ymax
aid[3,2]=ymin
}
aid[4,]=data[j,]
#aids line
gg=gg+geom_line(data=aid[1:2,],aes(time,angle))
gg=gg+geom_line(data=aid[3:4,],aes(time,angle))
}
}
#the last group
gg=gg+geom_line(data=data[j:n,], aes(time,angle))
gg
答案 0 :(得分:0)
这是一个有趣的练习。这是我想出的。我只对这一个数据集进行了测试,因此可能需要进行一些调整。
library(tidyverse)
data<-data.frame(t1=c(1,2,3,4),a1=c(200,100,300,20))
data <- data %>%
arrange(t1) %>%
mutate(t2 = c(data$t1[-1], 0)) %>%
mutate(a2 = c(data$a1[-1], 0)) %>%
mutate(grp = 0)
get_split <- function(t1, t2, a1, a2) {
# TEST: t1=1;t2=2;a1=10;a2=355
if((a2 - a1) > 180) {
return(a1/(a1 + 360 - a2)*(t2 - t1) + t1)
} else {
return(NA)
}
}
data <- rbind(
data[,c('t1', 'a1', 'grp')],
data.frame(t1 = mapply(get_split, data$t1, data$t2, data$a1, data$a2),
a1 = 0,
grp = 0),
data.frame(t1 = mapply(get_split, data$t1, data$t2, data$a1, data$a2),
a1 = 360,
grp = 1)
)
data <- data[!is.na(data$t1),] %>%
arrange(t1)
data$grp <- cumsum(data$grp)
ggplot(data) +
geom_line(aes(x = t1, y = a1, group = grp))