【问题标题】:How to plot a heat map on spherical surface having azimuth and elevation and a corresponding value for every position如何在具有方位角和仰角以及每个位置的相应值的球面上绘制热图
【发布时间】:2022-02-10 15:45:55
【问题描述】:

我有三个值:方位角、仰角和该位置的误差值。从那我有许多这样的 3 值组合。所以三个方位角、仰角和对应误差的数组。

我想用热图绘制一个球体,这样一个区域的颜色将代表球体该区域的误差。这将有助于确定球体的哪个部分显示出最高的错误。

我该如何绘制这个?我试图创建一个网格网格


r = 2
u, v = np.mgrid[0:2.01 * np.pi:(1/10)* np.pi, 0:1.01*np.pi:(1/10)* np.pi]
X = r * np.cos(u) * np.sin(v)
Y = r * np.sin(u) * np.sin(v)
Z = r * np.cos(v)

这将创建一个网格。如何将每个位置的方位角、仰角和误差整合到这个子区域分类中?

【问题讨论】:

    标签: python matplotlib 3d spherical-coordinate


    【解决方案1】:

    你可以这样做:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.rcParams["figure.figsize"] = [15.00, 6.0]
    plt.rcParams["figure.autolayout"] = True
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    r = 2
    u, v = np.mgrid[0:2.01 * np.pi:(1/10)* np.pi, 0:1.01*np.pi:(1/10)* np.pi]
    X = r * np.cos(u) * np.sin(v)
    Y = r * np.sin(u) * np.sin(v)
    Z = r * np.cos(v)
    ax.plot_surface(X, Y, Z, cmap=plt.cm.YlGnBu_r)
    plt.show()
    

    返回:

    更新

    另一种方式,如果你想引入你想要的点(在这里,我随机化,但如果你想使用代码不变,你需要以完全相同的方式格式化你的点),你可以这样做这个:

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib import cm
    
    
    def random_point(r=2):
        ct = 2*np.random.rand() - 1
        st = np.sqrt( 1 - ct**2 )
        phi = 2* np.pi *  np.random.rand()
        x = r * st * np.cos( phi)
        y = r * st * np.sin( phi)
        z = r * ct
        return np.array( [x, y, z ] )
    
    def near( p, pntList, d0 ):
        cnt=0
        for pj in pntList:
            dist=np.linalg.norm( p - pj )
            if dist < d0:
                cnt += 1 - dist/d0
        return cnt
    
    
    
    Azimuth_points = np.array([ random_point(2.02) for i in range(23) ] )
    
    fig = plt.figure()
    ax = fig.add_subplot( 1, 1, 1, projection='3d')
    
    u = np.linspace( 0, 2 * np.pi, 120)
    v = np.linspace( 0, np.pi, 60 )
    r = 2
    X = r * np.outer( np.cos( u ), np.sin( v ) )
    Y = r * np.outer( np.sin( u ), np.sin( v ) )
    Z = r * np.outer( np.ones( np.size( u ) ), np.cos( v ) )
    
    W = X.copy()
    for i in range( len(X) ):
        for j in range( len(X[0]) ):
            x = X[ i, j ]
            y = Y[ i, j ]
            z = Z[ i, j ]
            W[ i, j ] = near(np.array( [x, y, z ] ), Azimuth_points, 3)
    W = W / np.amax( W )
    myheatmap = W
    
    ax.plot_surface( X, Y,  Z, cstride=1, rstride=1, facecolors=cm.jet( myheatmap ) )
    plt.show() 
    

    给出:

    【讨论】:

    • 嘿!谢谢回复。我能够制作这个图表。我不知道该怎么做是将单独的数据框集成到球体的这个面上。根据我拥有的方位角和仰角值,我如何在这个球体表面的顶部绘制相应的误差。我可以让球体代表这个表面上的不同错误,我无法理解该怎么做。
    • 更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 2014-06-18
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2013-11-05
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多