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

如何在Python中创建极轴网格轮廓,python,matplotlib,Python,Matplotlib,我想创建一个如下图所示的图表 上图来自Zhou K.-J.等人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 =

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


上图来自Zhou K.-J.等人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()
我只得到这张长方形图片:


如何将其转换为“饼图样式”图片?

因此,您的代码几乎就在那里,但缺少三件事:

  • 您需要使用“极轴”投影。这会告诉pyplot您正在使用极坐标,因此它将创建一个圆形图,就像您链接的图像一样
  • 您的θ数组需要以弧度为单位,而不是以度为单位
  • 包含r和θ值的数组需要是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()
    
    以下是图像输出:


    我对
    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()
    
    样本结果:

    另一个(12乘36):