Matplotlib 中的极坐标图

发布于 2024-11-17 20:21:00 字数 487 浏览 1 评论 0原文

我有一组数据,想要使用 Matplotlib 生成极坐标等值线图。

我的数据如下:

  • theta - 角度值的一维数组
  • radius - 半径值的一维数组
  • value - 我想要的值的一维数组用于轮廓

这些都是正确对齐的一维数组 - 例如:

theta   radius   value
30      1        2.9
30      2        5.3
35      5        9.2

也就是说,所有值都重复足够多次,以便这个包含三个变量的“表”的每一行定义一个点。

如何根据这些值创建极坐标等值线图?我考虑过将半径和 theta 值转换为 x 和 y 值并在笛卡尔坐标中进行,但轮廓函数似乎需要 2D 数组,我不太明白为什么。

有什么想法吗?

I have a set of data that I want to use to produce a contour plot in polar co-ordinates using Matplotlib.

My data is the following:

  • theta - 1D array of angle values
  • radius - 1D array of radius values
  • value - 1D array of values that I want to use for the contours

These are all 1D arrays that align properly - eg:

theta   radius   value
30      1        2.9
30      2        5.3
35      5        9.2

That is, all of the values are repeated enough times so that each row of this 'table' of three variables defines one point.

How can I create a polar contour plot from these values? I've thought about converting the radius and theta values to x and y values and doing it in cartesian co-ordinates, but the contour function seems to require 2D arrays, and I can't quite understand why.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

日暮斜阳 2024-11-24 20:21:00

Matplotlib 的 contour() 函数期望将数据排列为点的 2D 网格以及每个网格点的相应值网格。如果您的数据自然排列在网格中,您可以将 r、theta 转换为 x、y 并使用contour(r*np.cos(theta), r*np.sin(theta), value)来制作你的情节。

如果您的数据不是自然网格化的,您应该遵循 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()

在此处输入图像描述

Matplotlib's contour() function expects data to be arranged as a 2D grid of points and corresponding grid of values for each of those grid points. If your data is naturally arranged in a grid you can convert r, theta to x, y and use contour(r*np.cos(theta), r*np.sin(theta), values) to make your plot.

If your data isn't naturally gridded, you should follow Stephen's advice and used griddata() to interpolate your data on to a grid.

The following script shows examples of both.

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

彩扇题诗 2024-11-24 20:21:00

我不知道是否可以直接绘制极坐标等值线图,但如果转换为笛卡尔坐标,则可以使用 griddata 函数将一维数组转换为二维数组。

I don't know if it's possible to do a polar contour plot directly, but if you convert to cartesian coordinates you can use the griddata function to convert your 1D arrays to 2D.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文