Как построить круг в конечной точке колчана в питоне? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть фрейм данных, состоящий из набора фактических позиций для 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()

Вывод кода дал следующее: График выходного колчана

Пожалуйста, дайте мнезнаю, как я могу построить круг в конце графика, используя значение «расстояние» от кадра данных в качестве диаметра.

PS: я не могу добавить график в виде картинки, потому что я новичок в stackoverflow и у меня недостаточно репутации.

1 Ответ

0 голосов
/ 14 октября 2019

Вы должны позаботиться о двух вещах, чтобы достичь этого.

  • Во-первых, вы должны установить scale и scale_units вашего колчана, чтобы иметь возможность вычислять координатуконец стрелки. Без этого Matplotlib использует автоматическое масштабирование, делая вычисление невозможным.
  • Затем вам нужно установить соотношение сторон ваших осей, чтобы можно было рисовать круговые круги (см. Демонстрацию )). Без этого я не смог бы поставить круги по правильной координате 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...