Вы должны позаботиться о двух вещах, чтобы достичь этого.
- Во-первых, вы должны установить
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](https://i.stack.imgur.com/cqiRF.png)