matplotlib中的极坐标轮廓图 - 最好(现代)的方法吗?

rob*_*ntw 19 python numpy matplotlib

更新:我已经在我的博客http://blog.rtwilson.com/producing-polar-contour-plots-with-matplotlib/上完成了我发现的方式的完整记录- 你可能想要先检查那里.

我正在尝试在matplotlib中绘制极坐标轮廓图.我在互联网上找到了各种资源,(a)我似乎无法使我的代码工作,(b)许多资源显得相当陈旧,我想知道现在是否有更好的方法.例如,http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg01953.html建议可以采取措施尽快改进,而那是在2006年!

我希望能够绘制正确的极坐标轮廓图 - 就像pcolor让你为它的绘图类型做的(见下面注释掉的部分),但我似乎无法找到任何方法来做到这一点,所以我是首先转换为笛卡尔坐标.

无论如何,我有以下代码:

from pylab import *
import numpy as np

azimuths = np.arange(0, 360, 10)
zeniths = np.arange(0, 70, 10)
values = []

for azimuth in azimuths:
  for zenith in zeniths:
    print "%i %i" % (azimuth, zenith)
    # Run some sort of model and get some output
    # We'll just use rand for this example
    values.append(rand())

theta = np.radians(azimuths)

values = np.array(values)
values = values.reshape(len(zeniths), len(azimuths))

# This (from http://old.nabble.com/2D-polar-surface-plot-td28896848.html)
# works fine
##############
# Create a polar axes
# ax = subplot(111, projection='polar')
# pcolor plot onto it
# c = ax.pcolor(theta, zeniths, values)
# show()

r, t = np.meshgrid(zeniths, azimuths)

x = r*np.cos(t)
y = r*np.sin(t)

contour(x, y, values)
Run Code Online (Sandbox Code Playgroud)

当我运行时,我得到一个错误TypeError: Inputs x and y must be 1D or 2D..我不知道为什么我会这样,因为x和y都是2D.难道我做错了什么?

此外,将我的模型返回的值放入列表然后重新整形它似乎相当笨拙.有一个更好的方法吗?

Joe*_*ton 22

你应该像往常一样使用ax.contourax.contourf使用极坐标图...但是你的代码中有一些错误.您将事物转换为弧度,但在绘制时使用度数值.而且,r, theta当你期望的时候,你正在传递轮廓theta, r.

作为一个简单的例子:

import numpy as np
import matplotlib.pyplot as plt

#-- Generate Data -----------------------------------------
# Using linspace so that the endpoint of 360 is included...
azimuths = np.radians(np.linspace(0, 360, 20))
zeniths = np.arange(0, 70, 10)

r, theta = np.meshgrid(zeniths, azimuths)
values = np.random.random((azimuths.size, zeniths.size))

#-- Plot... ------------------------------------------------
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
ax.contourf(theta, r, values)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 如何处理沿着θ= 0轴的这种丑陋的插值下降? (2认同)