mi@0: import numpy as np mi@0: from numpy import * mi@0: import sys, resource mi@0: # import matplotlib.pyplot as plt mi@0: import subprocess as sp mi@0: import cPickle as pickle mi@0: mi@0: # set this True or False to enable/disable plotting mitian@18: # plot_on = False mitian@18: plot_on = True mi@0: mi@0: if plot_on : mi@0: import matplotlib.pyplot as plt mitian@12: mitian@18: gt = np.genfromtxt('/Users/mitian/Documents/hg/segmenter/annotation/qupujicheng_annotation_30_3/10hongniang01.csv', delimiter=',')[:,0] mitian@18: # gt = np.genfromtxt('../annotation/TheBeatles/seg_tut/03LucyInTheSkyWithDiamonds.lab',)[:,0] mitian@12: mi@0: class OnsetPlot(object): mi@0: '''This class allows creating a series of plots easily.''' mi@0: mi@0: def __init__(self): mi@0: self.signal_plots = [] mi@0: self.marker_plots = [] mi@0: self.subplots = {} mi@0: mi@0: def reset(self): mi@0: self.__init__() mi@0: mi@0: def update(self,obj): mi@0: self.signal_plots = obj.signal_plots mi@0: self.marker_plots = obj.marker_plots mi@0: self.subplots = obj.subplots mi@0: mi@0: def add_plot(self,signal,subplot=-1,title=""): mi@0: self.signal_plots.append([signal,subplot,title]) mi@0: mi@0: def plot_signal(self,signal,subplot,title): mi@0: axes = self.figure.add_subplot(subplot) mi@0: axes.plot(signal) mitian@12: axes.get_xaxis().set_visible(False) mitian@12: axes.vlines(gt / gt[-1] * len(signal), np.min(signal), np.max(signal), colors='k') mitian@12: if title : axes.set_title(title, fontsize=20) mi@0: plt.axis('tight') mi@0: self.subplots.update({subplot:(axes,signal)}) mi@0: mi@0: def plot_markers(self,markers,symbol,subplot): mi@0: values = zeros(len(markers)) + 1 mi@0: axes,signal = self.subplots[subplot] mitian@12: axes.plot(markers,np.array(signal)[markers],symbol,markersize=12) mi@0: mi@0: def add_markers(self,markers,symbol="g^",subplot=-1): mi@0: self.marker_plots.append([markers,symbol,subplot]) mitian@18: mi@0: def show_in_subprocess(self): mi@0: '''Marshal the object into a separate subprocess to fix OS/X issues with threading.''' mi@0: cmd = "python %s" %__file__ mi@0: print "executing:", cmd mi@0: proc = sp.Popen(cmd, stdin = sp.PIPE, stdout = sp.PIPE, shell=True) mi@0: pickle.dump(self,proc.stdin) mi@0: result = proc.stdout.readlines() mi@0: for item in result: mi@0: print str(item).strip() mi@0: proc.wait() mi@0: return result mi@0: mi@0: def show(self): mi@0: self.figure = plt.figure(figsize=(15,6)) mi@0: num_plots = len(self.signal_plots) mi@0: for i,s in enumerate(self.signal_plots) : mi@0: j = i+1 mi@0: if s[1] < 1 : mi@0: s[1] = int("%(num_plots)s1%(j)s" %locals()) mi@0: else : mi@0: k = s[1] mi@0: s[1] = int("%(num_plots)s1%(k)s" %locals()) mi@0: print "plotting:",s[2] mi@0: s = tuple(s) mi@0: self.plot_signal(*s) mi@0: # plot marketrs on the last subplot mi@0: for m in self.marker_plots : mi@0: if m[2] < 1 or m[2] > num_plots: mi@0: m[2] = int("%(num_plots)s1%(num_plots)s" %locals()) mi@0: else : mi@0: k = m[2] mi@0: m[2] = int("%(num_plots)s1%(k)s" %locals()) mi@0: m = tuple(m) mi@0: self.plot_markers(*m) mi@0: plt.show(block=True) mi@0: mi@0: # create a module-level instance that can be reused across several files mi@0: onset_plot = OnsetPlot() mi@0: mi@0: if __name__ == '__main__': mi@0: obj = pickle.load(sys.stdin) mi@0: onset_plot = OnsetPlot() mi@0: onset_plot.update(obj) mi@0: onset_plot.show() mi@0: mi@0: mi@0: