R 从极坐标变换角度

R 从极坐标变换角度,r,geometry,geography,R,Geometry,Geography,我需要一些天使方面的帮助 使用软件包fossil和函数fossil::earth.bear计算轴承,根据帮助 “地球仪上任意两点之间从正北顺时针方向以度为单位的轴承” 我有一个用这个函数得到的角度向量,我需要对它们进行变换,使原点(0º)在x轴(东)上,角度逆时针递增 基本上,我需要一种方法顺时针旋转90º角度(因此0º将位于x轴“朝东”),然后以相反方向(逆时针)计算角度 直观地说,我试着给我的轴承加上90º(顺时针旋转),然后从360度中减去它们(计算“相反方向”的角度) 然而,它不起作用,

我需要一些天使方面的帮助

使用软件包
fossil
和函数
fossil::earth.bear
计算轴承,根据帮助

“地球仪上任意两点之间从正北顺时针方向以度为单位的轴承”

我有一个用这个函数得到的角度向量,我需要对它们进行变换,使原点(0º)在x轴(东)上,角度逆时针递增

基本上,我需要一种方法顺时针旋转90º角度(因此0º将位于x轴“朝东”),然后以相反方向(逆时针)计算角度

直观地说,我试着给我的轴承加上90º(顺时针旋转),然后从360度中减去它们(计算“相反方向”的角度)

然而,它不起作用,我高度怀疑每个象限有不同的事情要做,但我就是想不出来

下面用虚拟数据和极坐标直方图进行测试,以证明解决方案不起作用,因为结果向量
轴承2
不等同于起始向量
轴承

# Generate vector with 100 random values between 0 and 360
set.seed(123)
bearing <- runif(100, 0,360)
# generate a histogram with values binned every 5º
breaks = seq(0, 360, by=5)   
bearing.cut = cut(bearing, breaks, right=FALSE) 
bearing.freq = as.data.frame(table(bearing.cut))
bearing.freq$bearing.cut <- seq(5,360, by = 5)
#plot with ggplot
library(ggplot2)
ggplot(bearing.freq, aes(x = bearing.cut, y = Freq)) +
  coord_polar(theta = "x", start = 0 direction = 1) + #start 0 for north, direction 1 for cloclwise
  geom_bar(stat = "identity") +
  scale_x_continuous(breaks = seq(0, 360, 5))
#生成100个介于0和360之间的随机值的向量
种子集(123)

轴承好的,我想我已经弄明白了,但不确定它为什么会起作用。我就把它留在这里,把问题标记为已回答

解决方案是,对于第一个象限(0º和90º之间的角度,我们需要计算角度,因此我们需要
90方位
。对于其余象限,我们按照Gregor的建议(
360-(方位-90)

下面是一个可复制的示例的完整代码

library(ggplot2)
set.seed(123)

# 0º at North and clockwise
bearing <- runif(100, 0,360)

#create histogram
breaks = seq(0, 360, by=5)    # half-integer sequence 
bearing.cut = cut(bearing, breaks, right=FALSE) 
bearing.freq = as.data.frame(table(bearing.cut))
bearing.freq$bearing.cut <- seq(5,360, by = 5)

#plot
p1 <- ggplot(bearing.freq, aes(x = bearing.cut, y = Freq)) +
        coord_polar(theta = "x", start =0, direction = 1) +
        geom_bar(stat = "identity") +
        scale_x_continuous(breaks = seq(0, 360, 5))

# transform to 0º at E and counterclockwise
bearing2 <- ifelse(bearing <=90, (90-bearing), (360 - (bearing - 90)))

#create histogram
bearing.cut2 = cut(bearing2, breaks, right=FALSE) 
bearing.freq2 = as.data.frame(table(bearing.cut2))
bearing.freq2$bearing.cut <- seq(5,360, by = 5)

# plot
p2 <- ggplot(bearing.freq2, aes(x = bearing.cut, y = Freq)) +
        coord_polar(theta = "x", start = -pi/2, direction = -1) +
        geom_bar(stat = "identity") +
        scale_x_continuous(breaks = seq(0, 360, 5))

require(gridExtra)
grid.arrange(p1, p2, ncol=2)
库(ggplot2)
种子集(123)
#以北顺时针方向0º

轴承尚未完全读取,但您会说“我已尝试向轴承添加90º(顺时针旋转)”。通常添加角度是逆时针旋转。请尝试
360-(轴承-90)
library(ggplot2)
set.seed(123)

# 0º at North and clockwise
bearing <- runif(100, 0,360)

#create histogram
breaks = seq(0, 360, by=5)    # half-integer sequence 
bearing.cut = cut(bearing, breaks, right=FALSE) 
bearing.freq = as.data.frame(table(bearing.cut))
bearing.freq$bearing.cut <- seq(5,360, by = 5)

#plot
p1 <- ggplot(bearing.freq, aes(x = bearing.cut, y = Freq)) +
        coord_polar(theta = "x", start =0, direction = 1) +
        geom_bar(stat = "identity") +
        scale_x_continuous(breaks = seq(0, 360, 5))

# transform to 0º at E and counterclockwise
bearing2 <- ifelse(bearing <=90, (90-bearing), (360 - (bearing - 90)))

#create histogram
bearing.cut2 = cut(bearing2, breaks, right=FALSE) 
bearing.freq2 = as.data.frame(table(bearing.cut2))
bearing.freq2$bearing.cut <- seq(5,360, by = 5)

# plot
p2 <- ggplot(bearing.freq2, aes(x = bearing.cut, y = Freq)) +
        coord_polar(theta = "x", start = -pi/2, direction = -1) +
        geom_bar(stat = "identity") +
        scale_x_continuous(breaks = seq(0, 360, 5))

require(gridExtra)
grid.arrange(p1, p2, ncol=2)