интерактивный график matplotlib (рисование линий на графике акций) - PullRequest
0 голосов
/ 25 августа 2018

Я следовал за этим вопросом , но у меня возникли проблемы с его масштабированием.

после того, как я собрал свои данные, я строю длинный график со всеми акциями.

Я хочу иметь возможность выбрать график и нарисовать линию к нему.Эта строка должна быть сохранена в некоторой структуре данных (в настоящее время я просто печатаю ее).

три (основные) проблемы:

  1. У меня действительно странные результаты ..линия, которую строит Im, рисуется на другом графике и т.д ...

  2. Размеры графиков становятся все меньше и меньше, так как я добавляю больше их ... я хочу, чтобы они были исправлены ипросто прокрутите вниз, как я иду ...

  3. Моя конечная цель - иметь возможность редактировать эти строки, удалять их и т. д. и сохранять их только после нажатия кнопки "Сохранить".это возможно с плт?прямым питоническим способом (== не так сложно .. :))

из того, что я читаю (виджеты) - если я могу заставить мой код работать - следующие шаги

  1. Мне нужно создать кнопку проверки возле каждого графика, которая будет "выбирать" соответствующую ось.
  2. Теперь, когда я рисую линию, я могу знать, к какой оси она принадлежит.
  3. а как удалить линию после прорисовки?
  4. можно ли создать еще одну кнопку проверки для каждой строки после ее создания?а затем выберите линию и нажмите кнопку удаления?

код - создание данных

%matplotlib qt

example_data = {}
for i in range(5):
    df = pd.DataFrame(index=pd.date_range(start = "06/01/2018", end = "08/01/2018"), data = np.random.rand(62)*100)
    example_data[i] = df

код - рисование линии

import matplotlib.pyplot as plt
class LineDrawer(object):
    lines = []
    def draw_line(self):
        ax = plt.gca()
        xy = plt.ginput(2)

        x = [p[0] for p in xy]
        y = [p[1] for p in xy]
        line = plt.plot(x,y)
        ax.figure.canvas.draw()

        self.lines.append(line)
        print xy

код - построение чертежей и рисование

fig, axs = plt.subplots(figsize=(10,15), nrows=len(example_data), ncols=1, sharex=False)
plt.subplots_adjust(wspace=0.001, hspace=0.5)
plt.tight_layout()
ld = LineDrawer()

for i, stock in enumerate(example_data):
    df = example_data[stock]
    axs[i].plot(df.index ,df.values)
    axs[i].set_title("stock "+ `i`)
    ld.draw_line() # here you click on the plot
plt.show()
...