Hom*_*lli 11 python matplotlib
我使用matplotlib成功绘制了一组日期排序数据(X轴是日期).但是,我希望能够在绘制的图形上手动从一个(date1,y1)到另一个(date2,y2)绘制线条.
我似乎无法找到任何显示如何做到这一点的例子 - 或者确实如果它是可行的.
总而言之,这就是我想要做的:
有人可以发布一个骨架片段(最好带有更多信息的链接),以显示我如何开始实现这一点(主要要求是能够在图形上手动绘制线条,然后将线条保存/加载到绘图中).
注意:通过'手动',我的意思是能够通过单击一个点来绘制线条,然后单击绘制图形中的另一个点.在两点之间画一条线(或者只是点击一个点并在绘制的图形上的另一个点拖动并释放鼠标)
[[更新]]
dawe,非常感谢你提供的代码片段.这允许我做我想做的事情 - 但是,一旦在画布上绘制线条(在第二次鼠标点击之后),GUI崩溃并且我在控制台上收到此警告消息:
/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变量).目前,在'app'突然终止之前,我有机会只画一行.
daw*_*awe 11
我会写这样的东西:
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()