Matplotlib中的极坐标轮廓图
我有一组数据,想用它来在极坐标系中绘制等高线图,使用的是Matplotlib这个工具。
我的数据包括:
theta
- 一维数组,表示角度值radius
- 一维数组,表示半径值value
- 一维数组,表示我想用来绘制等高线的值
这些都是一维数组,排列得很整齐,比如:
theta radius value
30 1 2.9
30 2 5.3
35 5 9.2
也就是说,所有的值都重复了足够多次,这样这三个变量的“表格”中的每一行就定义了一个点。
我该如何从这些值创建一个极坐标的等高线图呢?我考虑过把半径和角度值转换成x和y值,然后在笛卡尔坐标系中绘制,但等高线函数似乎需要二维数组,我不太明白为什么。
有没有什么想法?
2 个回答
3
我不太确定能不能直接做极坐标的轮廓图,不过如果你把数据转换成笛卡尔坐标系的话,就可以用griddata
这个函数把你的一维数组转换成二维的了。
9
Matplotlib的contour()
函数需要数据以2D网格的形式排列,也就是说,你需要有一个点的网格和每个点对应的值。如果你的数据本身就是以网格的方式排列的,你可以把极坐标的r和theta转换成笛卡尔坐标的x和y,然后使用contour(r*np.cos(theta), r*np.sin(theta), values)
来绘制你的图。
如果你的数据不是自然形成的网格,建议你按照Stephen的建议,使用griddata()
来将你的数据插值到一个网格上。
下面的脚本展示了这两种情况的例子。
import pylab as plt
from matplotlib.mlab import griddata
import numpy as np
# data on a grid
r = np.linspace(0, 1, 100)
t = np.linspace(0, 2*np.pi, 100)
r, t = np.meshgrid(r, t)
z = (t-np.pi)**2 + 10*(r-0.5)**2
plt.subplot(121)
plt.contour(r*np.cos(t), r*np.sin(t), z)
# ungrid data, then re-grid it
r = r.flatten()
t = t.flatten()
x = r*np.cos(t)
y = r*np.sin(t)
z = z.flatten()
xgrid = np.linspace(x.min(), x.max(), 100)
ygrid = np.linspace(y.min(), y.max(), 100)
xgrid, ygrid = np.meshgrid(xgrid, ygrid)
zgrid = griddata(x,y,z, xgrid, ygrid)
plt.subplot(122)
plt.contour(xgrid, ygrid, zgrid)
plt.show()