Нарисуйте круги вокруг стрелок на графике колчана. Python - PullRequest
0 голосов
/ 19 июня 2020

У меня есть набор данных с 4 переменными движущейся точки; «x», «y», начальная точка, «x1», «y1», конечные точки. Мне нужно нарисовать колчан, а затем добавить кружочки вокруг стрелок. Я пробовал использовать plt.Circle, но это дало мне ошибку. моя конечная цель состоит в том, чтобы сделать 4 (3 или 5 тоже хорошо, если все равны) кружков вокруг каждой стрелки, причем самая большая точка - это точка, которая переместилась дальше всего, т.е. самая большая стрела. Я прикрепляю образец DataFrame, свой код, ошибку, которую я получил, когда попытался сделать первый круг и желаемый результат.

df=pd.DataFrame({'x':[1,2,3], 'y':[2,4,6], 'x1':[2,4,6],'y1':[4,6,10]})

ax = plt.quiver(df['x'],df['y'],df['x1'],df['y1'])
circle2 = plt.Circle((5, 5), 0.5, color='b', fill=False)
ax.add_artist(circle2)
plt.xlim(0,7)
plt.ylim(0,11)
plt.show()
AttributeError                            Traceback (most recent call last)
<ipython-input-4-a817aecb842e> in <module>
      3 ax = plt.quiver(df['x'],df['y'],df['x1'],df['y1'])
      4 circle2 = plt.Circle((5, 5), 0.5, color='b', fill=False)
----> 5 ax.add_artist(circle2)
      6 plt.show()

AttributeError: 'Quiver' object has no attribute 'add_artist'

мой текущий результат: Current output

и желаемый результат. Если кто-то сможет мне помочь, будет здорово. Desired output

1 Ответ

1 голос
/ 19 июня 2020

quiver вернуть как Quiver объект, чтобы получить соответствующий AxesSubplot объект, вам понадобится свойство axes:

ax.axes.add_artist(circle2)

Полный пример:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df=pd.DataFrame({'x':[1,2,3], 'y':[2,4,6], 'x1':[2,4,6],'y1':[4,6,10]})
scale = 10
ax = plt.quiver(df['x'],df['y'],df['x1'],df['y1'], angles='xy', scale_units='xy', scale=scale)

n_circles = 4
rmax = np.sqrt(df.x1**2+df.y1**2).max() / scale
for i in range(1,1+n_circles):
    r = rmax * i / n_circles
    for circle in [plt.Circle((x,y), r, color='b', fill=False) for x,y in zip(df.x, df.y)]:
        ax.axes.add_artist(circle)

plt.xlim(0,8)
plt.ylim(0,8)
ax.axes.get_figure().set_size_inches(3,3)

enter image description here

...