我有一个数据框,该数据框由一组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的新手,并且信誉不足。
答案 0 :(得分:0)
要实现这一目标,您必须注意两件事。
scale
和scale_units
才能计算箭头末端的坐标。如果没有它,Matplotlib将使用自动缩放功能,从而使计算变得不可能。这是示例代码:
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()
结果图: