如何使用pyplot matplotlib在等高线图(热图)上绘制具有特定半径的圆

时间:2018-04-13 14:26:16

标签: python matplotlib

我有一个来自超声波传感器的波形,基于我计算出的半径(距传感器的物距),我想用matplotlib绘制色图上的半径,以突出对象的所有可能位置在传感器的视野中 - 应该产生具有圆圈的色图,其上具有计算的半径,因此在该半径(值)处具有更大强度的结果具有更亮的颜色。

基于测量的半径:[0。3.434 6.868 10.302] 和价值观:[1,5,1,3] 这张图将说明我想要的东西(对于糟糕的gimp技能,这些应该是圈子):

enter image description here

在现实生活中,色彩图应该更多"波动"没有这种完美定义的窄圈。

这里的代码只给了我一张空白的图表:

def plot_2D_heatmap(self, radiuses, values):

    print(radiuses)
    #[  0.      3.434   6.868  10.302]
    print(values)
    #[1, 5, 1, 3]

    #calculate the x and y coordinates in mm for each measured radius and angle
    angles = np.linspace(0, 2*np.pi, 36) #every 10 degrees

    no_of_coordinates = len(radiuses) * len(angles)

    X = []
    Y = []
    Z = np.zeros((no_of_coordinates,no_of_coordinates))

    for r in range(len(radiuses)):
        for a in range(len(angles)):
            x = radiuses[r] * np.cos(angles[a])
            y = radiuses[r] * np.sin(angles[a])

            X.append(x)
            Y.append(y)
            Z[a][r] = values[r]

            '''
            print(r)
            print(a)
            print(values[r])
            '''

    norm = cm.colors.Normalize(vmax=abs(np.array(Z)).max(), vmin=-abs(np.array(Z)).max())


    fig, ax = plt.subplots()


    cset1 = ax.contourf(
       X, Y, Z, 4,
       norm=norm)
    plt.show()

这里有一些代码可以产生我想要的结果,但是圈子是"里面外出" - 中心应该是(0,0),我觉得我不应该这样做"手动:

    print(radiuses)
    #[  0.      3.434   6.868  10.302]
    print(values)
    #[1, 5, 1, 3]

    #calculate the x and y coordinates in mm for each measured radius and angle

    x = np.linspace(-20, 20, 40)
    y = np.linspace(-20, 20, 40)

    X, Y = np.meshgrid(y,x)

    angles = np.linspace(0, 2*np.pi, 360) #every 1 degrees

    no_of_coordinates = len(radiuses) * len(angles)

    Z = np.zeros((40, 40))

    for r in range(len(radiuses)):
        for a in range(len(angles)):
            x = radiuses[r] * np.sin(angles[a])
            y = radiuses[r] * np.cos(angles[a])

            x = round(x)
            y = round(y)

            Z[x][y] = values[r]

    norm = cm.colors.Normalize(vmax=abs(np.array(Z)).max(), vmin=-abs(np.array(Z)).max())


    fig, ax = plt.subplots()
    print(X)
    print(Y)
    print(Z)

    cset1 = ax.contourf(
       X, Y, Z, [1, 2],
       norm=norm)
    plt.colorbar(cset1)
    plt.show()

enter image description here

1 个答案:

答案 0 :(得分:0)

您的Z代表情节但不使用与情节相同的坐标。换句话说,图上的(0,0)实际上约为Z[20, 20]。循环遍历Z时的主要变化应为:

        x = int(round(x)) + 20
        y = int(round(y)) + 20

为了清楚起见,我对您的代码进行了一些小的更改,以便它可以无误地运行并提供您已经显示的内容。最后,关键的变化给出了以下情节,希望这是你想要的。

enter image description here