интерактивный графический режим matplotlib (рисование линий на графике вручную) - PullRequest
11 голосов
/ 04 февраля 2012

Я успешно нанес на график набор данных, упорядоченных по дате (ось X - дата), используя matplotlib.Однако я хочу иметь возможность вручную рисовать линии от одного (date1, y1) к другому (date2, y2) на построенном графике.

Кажется, я не могу найти ни одногопримеры, которые показывают, как это сделать - или даже если это возможно.

Подводя итог, я хочу сделать следующее:

  1. Нарисуйте набор линий на графикеgraph
  2. Сохранить данные нарисованной вручную линии в файл
  3. Загрузить данные нарисованной вручную линии из файла (для воссоздания графика)
  4. В идеале я хотел бы сохранить 'metaданные о нарисованных линиях (например, цвет, ширина линии и т. д.)

Может ли кто-нибудь опубликовать фрагмент скелета (желательно со ссылками на дополнительную информацию), чтобы показать, как я могу начать реализацию этого (основные требования - возможность рисовать линии на графике вручную, а затем сохранять / загружать линии в график).

Примечание: Под «вручную» я имею в виду возможностьЧтобы нарисовать линии, нажав на точку, а затем нажмите на другую точку впостроенный график.чтобы нарисовать линию между двумя точками (или просто щелкнуть мышью по одной точке и перетащить и отпустить мышь в другой точке на графике)

[[Обновить]]

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

/usr/local/lib/python2.6/dist-packages/matplotlib/backend_bases.py:2192: DeprecationWarning: Using default event loop until function specific to this GUI is implemented
  warnings.warn(str,DeprecationWarning)

Знаете ли вы, что является причиной этого предупреждения и внезапного завершения программы?

Кроме того, возможно ли нарисовать более одной линии на графике?(Я предполагаю, что это потребует написания какого-либо обработчика событий, который будет создавать экземпляр переменной linedrawer).В настоящий момент у меня есть возможность нарисовать только одну линию, прежде чем приложение внезапно завершится.

1 Ответ

11 голосов
/ 10 февраля 2012

Я написал бы что-то вроде этого:

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)

Используя ginput(), вы можете избежать более сложной обработки событий.Как это работает, вы строите что-то:

plt.plot([1,2,3,4,5])
ld = LineDrawer()
ld.draw_line() # here you click on the plot

Для сохранения / загрузки данных строки в файл вы можете легко реализовать метод, используя pickle или shelve.Вы также можете передать необходимые метаданные по методу draw_line()

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