【问题标题】:Translating radial data to a cartesian grid for surface plot将径向数据转换为笛卡尔网格以绘制曲面图
【发布时间】:2018-04-19 04:49:28
【问题描述】:

我有一个数据列表,其分量对应于二维网格上某个径向距离 r 处的电位。数据对应极坐标中的数据点,在theta分量上是对称的

import numpy as np
import matplotlib.pyplot as plt

r = np.linspace(1.0, 5.0, 99)
#Data looks like:
V = np.array([9.0,...,0.0])

x = np.linspace(-5.0,5.0,99)
y = np.linspace(-5.0,5.0,99)

xx,yy = np.meshgrid(x,y)

我想在 (x,y) 空间中创建数据的表面图,但是要使用 matplotlib,您需要一个与每个 (x,y) 位置的电位相对应的数据点网格。鉴于我有一组在 (r,theta) 空间中测量的数据,我该如何创建曲面图?

【问题讨论】:

  • 什么是 theta 以及代码中的 theta 在哪里?您要绘制 2D 图还是 3D 图?剧情应该展示什么?它应该将数据显示为地面以上的高度 (3D) 还是颜色 (2D) 或其他?
  • @ImportanceOfBeingErnest 是的,它应该将数据显示为 (x,y) 平面上方的表面高度。我的数据以不同的 r 值采样并与 theta 对称,即对于固定的 r,每个数据点都独立于 theta。

标签: python numpy matplotlib


【解决方案1】:

您需要先将数据转换为笛卡尔坐标,然后通过为每个 theta 重复值 V 创建一个与网格网格形状相同的值数组。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()

ax = fig.gca(projection='3d')

r = np.linspace(1.0, 5.0, 99)
V = np.sqrt(np.sinc(r-0.5)**2) # your data here (same length as r)


theta = np.linspace(0,2*np.pi,50)
R, Theta = np.meshgrid(r,theta)
X = R * np.cos(Theta)
Y = R * np.sin(Theta)
Z = np.tile(V,(len(theta),1))

norm = plt.Normalize(vmin=Z.min(), vmax=Z.max())
ax.plot_surface(X,Y,Z, facecolors=plt.cm.RdYlGn(norm(Z)))

plt.show()

【讨论】:

  • 谢谢!不过我很好奇,似乎 Z 是一个数组,其行对应于 r 位置,列对应于 theta 位置。我不太明白 matplotlib 如何或为什么将这些数据转换为对应于某个 x,y 坐标。
  • x,y 坐标在数组XY 中给出。 Z 在这些位置保存相应的值。因此,坐标为X[i,j], Y[i,j] 的点将具有值Z[i,j]
猜你喜欢
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多