如何在Python中创建极坐标网格轮廓

2024-05-28 19:29:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个如下图所示的图表。在


上面的图片来自周克杰等人的一篇论文。2014年关于电离层离子上升流。
当我尝试以下内容时:

import matplotlib.pyplot as plt
import numpy as np

thetabin=36
rbin=0.5
rmin=6
rmax=12
rmin=rmin+rbin
r_arr=linspace(rmin,rmax,(rmax-rmin)/rbin+1)
theta_arr=linspace(0,360,thetabin+1)
C = rand(len(r_arr), len(theta_arr))

plt.pcolor(r_arr,theta_arr,C.T)
xlabel(r'r')
ylabel(r'theta')
plt.show()

我只看到这张长方形的照片:

enter image description here

我怎样才能把它变成“饼图风格”的图片?在


Tags: importlenas图表图片plt电离层arr
2条回答

所以你的代码就快到了,但是有三件事没有做到:

  1. 你需要用极坐标投影。这将告诉pyplot您使用的是极坐标,因此它将创建一个与您链接的图像类似的圆形绘图。在
  2. 你的θ数组必须是弧度,而不是度。在
  3. 包含r和theta值的数组必须是2D,而不是1D

我已经创建了您代码的工作版本,并将其包含在下面:

    import matplotlib.pyplot as plt
    import numpy as np

    # number of bins in r and theta dimensions
    N_bins_theta = 36
    N_bins_r = 10

    # limits in r dimension
    rmin = 6
    rmax = 12

    # setting up 1D arrays in r and theta
    r = np.linspace(rmin, rmax, N_bins_r)
    theta = np.linspace(0, 2*np.pi, N_bins_theta)  # N.B. radians not degrees

    # 'gridding' the 1D arrays into 2D arrays so they can be used by pcolor
    theta, r = np.meshgrid(theta, r)

    # generating random data; note shape of array
    C = np.random.rand(N_bins_r, N_bins_theta)

    # setting up 'polar' projection and plotting
    ax = plt.subplot(111, projection='polar')
    plt.pcolor(theta, r, C)
    plt.show()

以下是图像输出:

A working polar plot

projection='polar'解决方案的美学不满意,我写了另一个。它使用一个自定义例程绘制环形扇区。在

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

COLORMAP = 'jet'        # choose colors here

def polar_annular_sector(r1, r2, theta1, theta2, **kargs):
    # draw annular sector in polar coordinates
    theta = np.arange(theta1, theta2+1, 1)/180.*np.pi
    cr1 = np.full_like(theta, r1)
    cr2 = np.full_like(theta, r2)
    plt.fill_between(theta, cr1, cr2, **kargs)

r_min=0
r_max=40
r_step = 5
r_arr = np.linspace(r_min,r_max-r_step,(r_max-r_min)/r_step)

theta_step = 15
theta_arr = np.linspace(0,360-theta_step,360/theta_step)

# generate random data
C = np.random.rand(len(r_arr), len(theta_arr))

# load colormap
space = np.linspace(0.0, 1.0, 100)
rgb = cm.get_cmap(COLORMAP)(space)[np.newaxis, :, :3]

# draw custom (slow) polar mesh profile
plt.polar()
for ri, r in enumerate(r_arr):
    print (ri, r)
    for ti, th in enumerate(theta_arr):
        color = rgb[0, int(C[ri, ti]*len(space))]
        polar_annular_sector(r, r+r_step, th, th+theta_step, color=color)
plt.show()

样品结果:

Color mesh in a circle

另一个(12×36):

Color mesh in a doughnut

相关问题 更多 >

    热门问题