0

首先,我在这类主题上找到了一些线程,但似乎没有一个完全符合我的要求,或者至少我在尝试解决它时真的放屁了,所以我感谢其他人的意见。

我有 4 个变量组成一个极坐标图,R、theta、phi 和 A,其中 A 代表测量值。

library(data.table)
library(viridis)
library(plot3D)
library(plotly)

df<-data.table(theta = seq(0,2*pi, length.out = 100))
df<-df[,.(phi= seq(0,pi/2, length.out = 100)),.(theta)]
df[, A:=rnorm(10000)]
#I've included r set to one just for the example's sake
df[, r:=1]

在 2d 的极坐标轴上绘制此类数据(对于给定的 phi)并具有由半径表示的值 A 很容易,例如使用 plotly:

p <- plot_ly(
  type = 'scatterpolar',
  mode = 'lines',
  r = df[theta == 0]$A,
  theta = (df[phi == 0]$theta)*(180/pi),
)
p

这使:

极地图

然而,这种测量本质上是球坐标网格上设定半径处的反射强度,用这种方式表示它真的很好。换句话说,让我的球体具有固定半径和每个坐标的 A 值,并用与 A 值对应的颜色绘制球体表面。我最接近的是这个,使用 plot3D 包中的'scatter3d':

#convert to cartesian

df[,x:=r*cos(theta)*sin(phi)]
df[,y:=r*sin(theta)*sin(phi)]
df[,z:=r*cos(phi)]

#plot

scatter3D(x = df$x, 
          y = df$y, 
          z = df$z, 
          zlim = c(-1,1),
          ylim = c(-1,1),
          xlim = c(-1,1),
          pch =18,
          bty = 'b2',
          colvar = df$A,
          col=inferno(200))

产生: 半球图

现在这是正确的方向,但我希望能够:A)将其作为彩色表面而不是一系列点,B)能够像使用 rgl 包一样旋转它等等,c)有一个标记的极轴而不是笛卡尔盒子,尽管我认为这个完全超出了范围。

我没有成功尝试过的其他包,往往需要将极坐标转换为规则间隔的笛卡尔坐标矩阵,然后并不总是允许你映射颜色(或者至少我不知道如何得到A 到 x、y 和 z 矩阵的映射)。

有没有人有更好的想法?

谢谢。

4

0 回答 0