Matplotlib:如何跨多个小部件工作?如何正确阻止他们?

时间:2013-04-20 12:51:39

标签: python matplotlib widget break

我想知道是否有人可以在matplotlib小部件的应用程序中帮助我解决这个问题:

我必须处理HII星系的光谱(这些只是一个平坦的地块,有一些突然的山峰,其位置为我们所知)。我需要“确认”这些线的位置(可以说是图上峰的厚度)并确定连续体水平(这意味着峰的左右区域的图的平均y坐标)。这是一个简单的任务,但考虑到图中的数量和每个图中的行数,我想使用一个简短的python代码来简化过程,避免错过一些峰值。

我在youtube上观看了John Hunter的讲座,我相信我会非常满意使用默认小部件作为我的GUI,特别是spanselector,press event和cursor event。

我的问题是我不确定使用影响同一图表的几个小部件的正确方法:目前我的代码打开一个给定的频谱并开始显示一小部分情节,我知道我的第一行应该是。然后它应该继续显示下一行。在每个循环中它应该执行如下操作:(它是来自matplotlib库中的spanselector示例的副本,适用于此示例)

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector

def onselectPeak(xmin, xmax):
        indmin, indmax = np.searchsorted(x, (xmin, xmax))
        indmax = min(len(x)-1, indmax)
        print "Xmin " + str(indmin) + " at index " + str(indmin)
        print "Xmax " + str(indmax) + " at index " + str(indmax)
        ax.fill_between(x[indmin:indmax], -1.0, y[indmin:indmax],facecolor='Red',alpha=0.5)

def onselectLeftContinuum(xmin, xmax):
        indmin, indmax = np.searchsorted(x, (xmin, xmax))
        indmax = min(len(x)-1, indmax)      
        print "Leftmin " + str(indmin) + " at index " + str(indmin)
        print "Leftmax " + str(indmax) + " at index " + str(indmax)
        ax.fill_between(x[indmin:indmax], -1.0, y[indmin:indmax],facecolor='Blue',alpha=0.5)

def onselectRightContinuum(xmin, xmax):
        indmin, indmax = np.searchsorted(x, (xmin, xmax))
        indmax = min(len(x)-1, indmax)
        print "Xmin " + str(indmin) + " at index " + str(indmin)
        print "Xmax " + str(indmax) + " at index " + str(indmax)
        ax.fill_between(x[indmin:indmax], -1.0, y[indmin:indmax],facecolor='Blue',alpha=0.5)       

fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, axisbg='#FFFFCC')

x = np.arange(0.0, 10.0, 1.0)
y = [0.0,0.0,0.0,0.0,5.0,0.0,0.0,0.0,0.0,0.0,]

ax.plot(x, y, '-')
ax.set_ylim([-1.0,6.0])

ax.set_title('Press left mouse button and drag Line region')
span = SpanSelector(ax, onselectPeak, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='red') )

ax.set_title('Press left mouse button and drag left region of the continuum')
span = SpanSelector(ax, onselectLeftContinuum, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='blue') )

ax.set_title('Press left mouse button and drag right region of the continuum')
span = SpanSelector(ax, onselectRightContinuum, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='blue') )

plt.show()

print "Task Completed"

首先,此代码有两个问题:

  1. 情节跳转到最终的跨度选择,忽略两者 前
  2. 代码不会停止。在spanselector I的所有例子中 已经发现,代码一直在运行......我找不到停止的方法 他们所以我可以继续循环......
  3. 最后,(但不太重要)每个区域的修改填充 在每个地区选择之后,情节都没有“记住”。
  4. 我的第一个问题是如何避免这些问题......我的另外一些疑问是:

    • A)我想我可以通过显示和关闭图表来完成这项工作 在每个跨度选择器之前......但这会打破我的工作流程......
    • B)我能用关键事件来管理吗?怎么样?应该是一个单一的 在代码中前进的关键?我们应该是一个单一的代码 我要申请的每个小部件?
    • C)您能否就matplotlib的任何教程向我提供建议以了解具体方法 使用关键事件管理代码流?

    如果你设法阅读这个非常长的问题非常感谢!

    --- EDIT

    上周我一直在研究这个问题,我终于开始明白它应该如何运作了:

    1)事件和plt.show必须一直在运行。实际上,后者被设计为在代码末尾设置实现。事件调用应该在

    之前

    2)要更改数字上的数据,您可以使用关键事件。这篇文章说明了正确的方法,它包括一个类

    Using events with matplotlib in a for loop

    3)这种结构的问题是你的代码必须用不同的方法分段。您需要确保在主代码中定义变量,以便可以跨不同方法导入它们(我仍然在努力解决这个问题......我将在完成后发布示例代码)

    另外一个问题:当我尝试使用spanselector小部件运行游标小部件时,小部件会以一种相当......痛苦的方式向眼睛方向发出故障......无论如何要避免这种情况吗?我一直在玩游戏useblit小部件,但没有运气

0 个答案:

没有答案