【问题标题】:matplotlib interactive graphing (manually drawing lines on a graph)matplotlib 交互式绘图(在图形上手动绘制线条)
【发布时间】:2012-02-26 13:26:32
【问题描述】:

我已经使用 matplotlib 成功绘制了一组日期序列数据(X 轴是日期)。但是,我希望能够手动在绘图图上从一个 (date1, y1) 到另一个 (date2, y2) 画线。

我似乎找不到任何示例来说明如何做到这一点 - 或者确实是可能的。

总而言之,这就是我想要做的:

  1. 在绘制的图形上绘制一组线
  2. 将手动绘制的线条数据保存到文件中
  3. 从文件中加载手动绘制的线数据(以重新创建图形)
  4. 理想情况下,我想存储有关绘制线的“元数据”(例如颜色、线宽等)

有人可以发布一个骨架 sn-p(最好带有指向更多信息的链接),以展示我如何开始实现它(主要要求是能够在图表上手动绘制线条然后保存/加载线成情节)。

注意:“手动”是指能够通过单击一个点,然后单击绘图图中的另一个点来绘制线条。在两点之间画一条线(或简单地单击一个点并在绘制的图形上的另一个点上拖动并释放鼠标)

[[更新]]

dawe,非常感谢您提供的 sn-p。这使我可以做我想做的事情 - 但是,一旦在画布上绘制线条(在第二次鼠标单击之后),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 变量)。目前,我有机会在“应用程序”突然终止之前只画一条线。

【问题讨论】:

  • "Manually" 是模棱两可的(用粗体表示并不能解决歧义)。你的意思是手动点击一个点,然后点击另一个,还是手动输入一些东西?或者两者都足够了?
  • @DSM:澄清了问题中使用的“手动”的含义。 HTH
  • 我建议查看event handling 示例。
  • 对我来说,手动意味着拿起铅笔开始画画。尽量准确,面对模棱两可,我会尽量拒绝猜测的诱惑(我在你澄清后删除了我的答案)。

标签: python matplotlib


【解决方案1】:

我会这样写:

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

为了将行数据保存/加载到文件中,您可以使用pickleshelve 轻松实现一个方法。也可以通过draw_line()方法传递必要的元数据

【讨论】:

  • +1 让我(几乎)到达那里的代码。这就是我想要做的完全!太感谢了!。当前的 sn-p 有一个小问题(除了小的命名空间问题)。当我运行脚本时,它允许我通过单击(就像我想要的那样)在画布上绘图 - 但是,在第二次鼠标单击时,当画线时,GUI 立即崩溃,并且我在控制台上有一个警告 kessage (请参阅我更新的问题)
  • 确保在 IPython pylab 模式下运行此代码:ipython -pylab。这将为您正确使用的后端设置事件循环,从而使这种快速而肮脏的交互发挥作用。
猜你喜欢
  • 2013-12-14
  • 2020-02-28
  • 2012-04-11
  • 2022-11-10
  • 2021-04-08
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
相关资源
最近更新 更多