Matplotlib中的极坐标轮廓图

9 投票
2 回答
8827 浏览
提问于 2025-04-16 20:39

我有一组数据,想用它来在极坐标系中绘制等高线图,使用的是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()

enter image description here

撰写回答