我正在尝试在R中创建一个散点图,其中每个点都有一个箭头或只是一条线,表示“方向”或与该特定点相关的方向。每个点都有不同的方向,但所有的方向线应该是相同的长度。角度范围为0-360度,0为向右,然后从那里逆时针移动。最大的问题是我的轴是对数刻度,x和y轴以不同的速率增加,从而抛出方向。我的数据是一个3x35矩阵,在第三列中有X,Y坐标和我的方向角。
我尝试过使用箭头功能;但是,箭头似乎没有指向正确的方向,它们的长度根据角度而变化。这是我使用的简单代码:
plot(data$SF.X., data$TF.Y.,log="xy", pch=19, cex=0.8,ylim=c(0.031,20), xlim = c(0.031,1))
arrows(data$SF.X., data$TF.Y., x1=data$SF.X.+length*cos(data$Degrees), y1=data$TF.Y.+length*sin(data$Degrees),
code = 2, length=0.03, col="Red")
这是上面代码的结果: 有人可以指出我正确的方向,如何让我的方向线长度相同,并根据我的第三列中的角度值指向正确的方向?
非常感谢你!
以下是我的数据集示例:
x = c(0.47,0.80,0.09,0.78,0.14)
y = c(2.71,4.51,1.85,5.56,0.98)
orientation (degrees) = c(42.51,9.27,11.31,0.52,93.4)
答案 0 :(得分:0)
对于角度来说,它很容易,R总是以弧度为角度使用,所以你只需要将度数向量乘以pi/180
。
对于箭头的长度,它更棘手。由于轴刻度和图像格式存在变形,因此我通过对轴进行归一化,然后更改标签并将图形保存为完美的方形格式来提出解决方法。可能不是最好的解决方案,但它提供了预期的输出。
x = c(0.47,0.80,0.09,0.78,0.14)
y = c(2.71,4.51,1.85,5.56,0.98)
degrees = c(42.51,9.27,11.31,0.52,93.4)
x.norm = (x-min(x))/(max(x)-min(x))
y.norm = (y-min(y))/(max(y)-min(y))
l <- 0.15
png("/home/ubuntu/Downloads/sample.png", width=500, height=500)
par(mar=c(4,4,1,1))
plot(x.norm, y.norm, pch=19, cex=0.8, col="Blue",
axes=FALSE, xlab="x", ylab="y", xlim=c(-0.1,1.1), ylim=c(-0.1,1.1))
arrows(x.norm, y.norm,
x1=x.norm+l*cos(degrees*pi/180), y1=y.norm+l*sin(degrees*pi/180),
length=0.05, col="Gray")
axis(1, at=seq(0,1,0.1), round(seq(min(x),max(x), (max(x)-min(x))/10),1))
axis(2, at=seq(0,1,0.1), round(seq(min(y),max(y), (max(y)-min(y))/10),1))
dev.off()