如何在python的颤动图的端点处绘制圆?

时间:2019-10-14 07:38:09

标签: python matplotlib

我有一个数据框,该数据框由一组X和Y的实际位置及其目标位置组成,并且已经完成了以下的颤动图。现在,我需要使用误差(与数据框的“距离”值)作为直径,在颤动图的终点绘制一个圆。如果有人可以指导我如何做,那将真的很有帮助。

数据框如下所示:(仅在此处添加前10行)

rTargetPosX  rTargetPosY  Actual_PositionX Actual_PositionY  Distance 
27.284047    1.297492     27.321201        1.373254          0.186804
27.275899    26.338611    27.314813        26.376698         0.176827
27.270484    51.341236    27.295110        51.420660         0.185890
27.271348    76.357327    27.308524        76.430147         0.198785
27.272140    101.359197   27.337727        101.411670        0.194511
27.272670    126.359012   27.278433        126.448553        0.191449
57.271197    1.366512     57.347794        1.316646          0.222369
57.277112    26.326415    57.295121        26.379356         0.163582
57.272157    51.333405    57.320267        51.358652         0.199854
57.273236    76.339232    57.308497        76.397345         0.169904
57.276851    101.347857   57.324807        101.420733        0.196919

到目前为止,我所做的代码和结果如下:

fig, ax =plt.subplots()
for i in range(0,len(df_quiver)):
    x = df_quiver.iloc[i][0]

    y = df_quiver.iloc[i][1]

    u = df_quiver.iloc[i][2]
    v = df_quiver.iloc[i][3]
    plt.quiver([x],[y],u,v,width=0.003)

plt.show()

代码的输出如下: The output quiver plot

请让我知道如何使用距数据框的“距离”值作为直径在图的末端绘制圆。

P.S:我无法将绘图添加为图片,因为我是Stackoverflow的新手,并且信誉不足。

1 个答案:

答案 0 :(得分:0)

要实现这一目标,您必须注意两件事。

  • 首先,您必须设置颤动图的scalescale_units才能计算箭头末端的坐标。如果没有它,Matplotlib将使用自动缩放功能,从而使计算变得不可能。
  • 然后,您必须set the aspect ratio个轴才能绘制圆形圆(请参阅demo)。没有这个,我将无法将圆放置在正确的y坐标处并使它们变为圆形。

这是示例代码:

import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd


def main():
    df_quiver = pd.DataFrame(
        [[27.284047, 1.297492, 27.321201, 1.373254, 0.186804],
         [27.275899, 26.338611, 27.314813, 26.376698, 0.176827],
         [27.270484, 51.341236, 27.295110, 51.420660, 0.185890],
         [27.271348, 76.357327, 27.308524, 76.430147, 0.198785],
         [27.272140, 101.359197, 27.337727, 101.411670, 0.194511],
         [27.272670, 126.359012, 27.278433, 126.448553, 0.191449],
         [57.271197, 1.366512, 57.347794, 1.316646, 0.222369],
         [57.277112, 26.326415, 57.295121, 26.379356, 0.163582],
         [57.272157, 51.333405, 57.320267, 51.358652, 0.199854],
         [57.273236, 76.339232, 57.308497, 76.397345, 0.169904],
         [57.276851, 101.347857, 57.324807, 101.420733, 0.196919]],
        columns = ["rTargetPosX", "rTargetPosY", "Actual_PositionX", "Actual_PositionY", "Distance"]
    )

    scale = 2
    fig, axs =plt.subplots(2, 1)
    axs[0].set_title("Aspect ratio: default")
    axs[1].axis('equal')
    axs[1].set_title("Aspect ratio: 'equal'")
    axs[0].quiver(
        df_quiver["rTargetPosX"],
        df_quiver["rTargetPosY"],
        df_quiver["Actual_PositionX"],
        df_quiver["Actual_PositionY"],
        width=0.003,
        scale_units="x",
        scale=scale
    )
    axs[1].quiver(
        df_quiver["rTargetPosX"],
        df_quiver["rTargetPosY"],
        df_quiver["Actual_PositionX"],
        df_quiver["Actual_PositionY"],
        width=0.003,
        scale_units="x",
        scale=scale
    )
    for _, sample in df_quiver.iterrows():
        x = sample["rTargetPosX"] + sample["Actual_PositionX"] / scale
        y = sample["rTargetPosY"] + sample["Actual_PositionY"] / scale
        axs[0].add_patch(mpl.patches.Circle(
            (x, y), sample["Distance"] * 10,
            alpha=0.7, zorder=-1
        ))
        axs[1].add_patch(mpl.patches.Circle(
            (x, y), sample["Distance"] * 10,
            alpha=0.7, zorder=-1
        ))


    plt.show()

if __name__ == '__main__':
    main()

结果图:

Rendering of the above code