我有一张图表,上面带有一些极坐标图图像,并给出了一些x和y坐标。但是,其中一些图表重叠。我需要创建一种方法来将每个图表间隔15个距离,但要最大程度地减少x和y的变化。
因此,如果一个点到另一个点的距离为13,则距我的原点(50,50)最远的点将移动2的距离,以确保点之间的新距离为15。使用距离公式表示点之间的距离。 原点是(50,50),因为那是我新图片的中心。
功能
我正在考虑使用以下方法创建check.x
和check.y
函数:
该函数将针对测试点测试给定点。如果给定点距离原点较远,则将其移动,否则不执行任何操作。如果给定点距原点最远,并且给定点与测试点之间的距离小于15,则将给定点移动15个距离。否则,什么也不做。
下面我有一个粗略的草稿,但是在如何编写参数和返回值方面遇到了麻烦。观察:
## Creates new x coordinate given points
check.x<-function(x,rank1,rank2, distance,y_cor.1,x_cor.2,y_cor.2){
origin.x=x_cor.2
origin.y=y_cor.2
newish.x=x-x_cor.2
newish.y=y_cor.1-y_cor.2
theta=atan2(newish.y,newish.x)
if(rank1>rank2){##adjust x
if(distance<15&distance!=0){
new.x<-cos(theta)*15+50
}else{}
}else{}
return(new.x)
}
## Creates new y coordinate given points
check_y<-function(y,rank1,rank2, distance,x_cor.1,x_cor.2,y_cor.2){
origin.x=x_cor.2
origin.y=y_cor.2
newish.x=x_cor.1-x_cor.2
newish.y=y-y_cor.2
theta=atan2(newish.y,newish.x)
if(rank1>rank2){##adjust x
if(distance<15&distance!=0){
new.y<-sin(theta)*15+50
}else{}
}else{}
return(new.y)
}
循环
运行此命令时,我相信应该将其放入while loop
的{{1}}中。但是,当我在自己的数据帧上distance<15
对其进行一次操作时,可以完成一次。然后,我对join
进行了计算,但是随后我需要重新检查距离,并使用新的点再次加入数据框。我该如何纠正这个问题以减少连接数并使它覆盖新的点?我已经编写了尽可能多的代码,但是无法进一步考虑下一步,但是提供了一些注释,作为我认为应该如何进行的步骤。每个check.
表示一个新步骤
##
**数据**
## Coordinate DataFrame
coordf<-data.frame(df$Id,df$GroupId,df$x_coordinate,df$y_coordinate)
coordf<-coordf[!duplicated(coordf$df.Id),]
colnames(coordf)<-c('Id','Group','x_coordinate','y_coordinate')
coordf$DistOrigin<-sqrt((coordf$x_coordinate-50)^2+(coordf$y_coordinate-50)^2)
## Orders/Ranks position based on distance to origin
coordf$rank<-ave(coordf$DistOrigin,
factor(paste(coordf$Group)),
FUN=rank)
point_df<-coordf%>% mutate(k=1) ## dummy column
point_df<-point_df%>% ## Distance between each points
full_join(point_df,by='k')%>%
mutate(dist=sqrt((x_coordinate.x-x_coordinate.y)^2+(y_coordinate.x-y_coordinate.y)^2))%>%
select(-k)
## Removes the points that are the same, i.e. x1=x2 and y1=y2 and within same group
point_df<-point_df[(point_df$Group.x==point_df$Group.y),]
point_df<-point_df[(point_df$dist!=0),]
## Loop ... I have also never written a while loop before in R
## This is where I get lost due to the complexity
while (distance <15){
## Run check.x and check.y
## Take the return values and attach them in a new column
## Recheck the distance
## Re-rank the points in response to the (50,50) origin
}