我想知道是否有人可以在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"
首先,此代码有两个问题:
我的第一个问题是如何避免这些问题......我的另外一些疑问是:
如果你设法阅读这个非常长的问题非常感谢!
--- EDIT
上周我一直在研究这个问题,我终于开始明白它应该如何运作了:
1)事件和plt.show必须一直在运行。实际上,后者被设计为在代码末尾设置实现。事件调用应该在
之前2)要更改数字上的数据,您可以使用关键事件。这篇文章说明了正确的方法,它包括一个类
Using events with matplotlib in a for loop
3)这种结构的问题是你的代码必须用不同的方法分段。您需要确保在主代码中定义变量,以便可以跨不同方法导入它们(我仍然在努力解决这个问题......我将在完成后发布示例代码)
另外一个问题:当我尝试使用spanselector小部件运行游标小部件时,小部件会以一种相当......痛苦的方式向眼睛方向发出故障......无论如何要避免这种情况吗?我一直在玩游戏useblit小部件,但没有运气