繁体   English   中英

R RGL 3D对数刻度图和天线方向图

[英]R rgl 3d log scale plot and Antenna pattern plots

首先,在分享我的问题之前,我想分享一些可能对外面的人有用的代码。 我一直在寻找一些时间代码以绘制3d天线测量结果,但找不到能做到这一点的代码。 问题在于天线测量值具有极坐标,而典型的3d图函数使用笛卡尔坐标。 因此,下面的代码就是这样做的(我不是高级程序员,所以我可以肯定有人可以对其进行优化)。 该代码可以直接运行,并且添加了注释以使其更易于阅读。

require("rgl")
require("fields")
degreeToRadian<-function(degree){
  return   (0.01745329252*degree)
}

turnPolarToX<-function(Amplitude,Coordinate){
  return (Amplitude*cos(degreeToRadian(Coordinate)))
}

turnPolarToY<-function(Amplitude,Coordinate){
  return (Amplitude*sin(degreeToRadian(Coordinate)))
}


#  inputs for the code
test<-runif(359,min=-50,max=-20) # the 359 elements correspond to the polar coordinates of 1 to 359
test2<-runif(359,min=-50,max=-20)  # the 359 elements correspond to the polar coordinates of 1 to 359
test3<-runif(359,min=-50,max=-20)  # the 359 elements correspond to the polar coordinates of 1 to 359

# My three input vectors above are considered to be dBm values, typically unit for antenna or propagation measurements
# I want to plot those on three different 3d planes the XY, the YZ and the ZX. Since the rgl does not support
# polar coordinates I need to cast my polar coordinates to cartesian ones, using the three functions
# defined at the beginning. I also need to change my dBm values to their linear relative ones that are the mW


# Convert my dBm to linear ones
test<-10^(test/10)
test2<-10^(test2/10)
test3<-10^(test3/10) 

# Start preparing the data to be plotted in cartesian domain
X1<-turnPolarToX(test,1:359)
Y1<-turnPolarToY(test,1:359)
Z1<-rep(0,359)


X2<-turnPolarToX(test2,1:359)
Y2<-rep(0,359)
Z2<-turnPolarToY(test2,1:359) 

X3<-rep(0,359)
Y3<-turnPolarToX(test3,1:359)
Z3<-turnPolarToY(test3,1:359)


# Time for the plotting now

Min<-min(test,test2,test3)
Max<-max(test,test2,test3)

bgplot3d( suppressWarnings ( 
    image.plot( legend.only=TRUE, legend.args=list(text='dBm/100kHz'), zlim=c(Min,Max),col=plotrix::color.scale(seq(Min,Max,length.out=21),c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)))
    ) # zlim is the colorbar numbers
) 

# for below alternatively you can also use the lines3d to get values
points3d(X1,Y1,Z1,col=plotrix::color.scale(test,c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)),add=TRUE)
points3d(X2,Y2,Z2,col=plotrix::color.scale(test2,c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)),add=TRUE)
points3d(X3,Y3,Z3,col=plotrix::color.scale(test3,c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)),add=TRUE)

我现在遇到的问题是,理想情况下,我的绘图应该是rgl数据包不支持的对数刻度! 如果我尝试在X,Y,Z上使用日志来压缩它们,则会得到一个错误,即未为负数定义日志(当然是正确的)。 当不支持对数刻度绘图时,您如何解决压缩轴值的问题?

感谢您的答复亚历克斯

将对数刻度应用于X,Y和Z是没有意义的。只需将其应用于原始数据,然后将记录的值转换为极坐标即可。

由于记录的测试值是负数,因此您可能希望应用一个偏移量。 具有负半径值的极坐标很难解释。

完成此操作后,可以使用axis3d()函数向绘图添加带有任意标签的轴。 例如,如果您希望原点对应于-50 dBm,则可以跳过对线性坐标的转换,而只需加上50。在计算标签时需要撤消此操作。 这是您的示例,已修改:

require("rgl")
require("fields")
degreeToRadian<-function(degree){
  return   (0.01745329252*degree)
}

turnPolarToX<-function(Amplitude,Coordinate){
  return (Amplitude*cos(degreeToRadian(Coordinate)))
}

turnPolarToY<-function(Amplitude,Coordinate){
  return (Amplitude*sin(degreeToRadian(Coordinate)))
}


#  inputs for the code
test<-runif(359,min=-50,max=-20) # the 359 elements correspond to the polar coordinates of 1 to 359
test2<-runif(359,min=-50,max=-20)  # the 359 elements correspond to the polar coordinates of 1 to 359
test3<-runif(359,min=-50,max=-20)  # the 359 elements correspond to the polar coordinates of 1 to 359

# Add an offset of 50 to the values.

test <- test + 50
test2 <- test2 + 50
test3 <- test3 + 50

# Start preparing the data to be plotted in cartesian domain
X1<-turnPolarToX(test,1:359)
Y1<-turnPolarToY(test,1:359)
Z1<-rep(0,359)


X2<-turnPolarToX(test2,1:359)
Y2<-rep(0,359)
Z2<-turnPolarToY(test2,1:359) 

X3<-rep(0,359)
Y3<-turnPolarToX(test3,1:359)
Z3<-turnPolarToY(test3,1:359)


# Time for the plotting now

Min<-min(test,test2,test3)
Max<-max(test,test2,test3)

bgplot3d( suppressWarnings ( 
    image.plot( legend.only=TRUE, legend.args=list(text='dBm/100kHz'), zlim=c(Min,Max)-50,col=plotrix::color.scale(seq(Min-50,Max-50,length.out=21),c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)-50))
    ) # zlim is the colorbar numbers
) 

# for below alternatively you can also use the lines3d to get values
points3d(X1,Y1,Z1,col=plotrix::color.scale(test,c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)),add=TRUE)
points3d(X2,Y2,Z2,col=plotrix::color.scale(test2,c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)),add=TRUE)
points3d(X3,Y3,Z3,col=plotrix::color.scale(test3,c(0,1,1),c(0,1,0),0,xrange=c(Min,Max)),add=TRUE)

# Add axes

labels <- pretty(c(-50, -20))
axis3d("x", at = labels + 50, labels = labels, pos = c(NA, 0, 0) )
axis3d("y", at = labels + 50, labels = labels, pos = c(0, NA, 0) )
axis3d("z", at = labels + 50, labels = labels, pos = c(0, 0, NA) )

在我的系统上,它会产生以下显示:

在此处输入图片说明

您可能需要添加圆圈以显示比例在每个平面中如何继续。 这段代码可以做到:

theta <- seq(0, 2*pi, len = 100)
for (i in seq_along(labels)) {
  x <- (labels[i] + 50)*cos(theta)
  y <- (labels[i] + 50)*sin(theta)
  lines3d(x, y, 0)
  lines3d(x, 0, y)
  lines3d(0, x, y)
}

我发现在添加新图时太忙了,但是您可以尝试并自己决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM