>>>>> "Tom" == Tom Denniston <tom.denniston@...> writes:
Tom> I follow this list rather closely so I am hoping that I
Tom> haven't missed something obvious here.
Tom> I am trying to plot a line graph with pylab.plot. I was
Tom> wondering if there is an easy way to plot a smoothed line
Tom> graph like excel does by default. I could obviously apply a
Tom> signal filter but I was wondering if there is a simple user
Tom> friendly way to get something like excel does in matplotlb
Tom> without the user having to know about signal processing.
It would help if you described more precisely what it is Excel does.
You may be surprised to learn that I rarely use Excel for plotting
<wink>
In general, and with a few exceptions, mpl tries to be a plotting
library, and despite some claims to the contrary, tries not to do much
magic. Automatic smoothing sounds a bit dangerous to me, and as you
say, is squarely in the realm of signal processing.
Here is a little helper function I use to generate a smoothing
functional  it is a function that returns a function for smoothing
signals with a low pass filter.
import scipy.signal as sig
def lowbutter(lpcf, lpsf, Fs, gpass=3, gstop=15):
"""
Return a low pass butterworth filter with
lpcf : lowpass corner freq
lpsf : lowpass stop freq
gpass : corner freq attenuation
gstop : stop freq attenuation
return value is a callable function that will filter your data
Example:
mybutt = lowbutter(12, 15, eeg.freq) # pun intended
sfilt = mybutt(s1)
"""
Nyq = Fs/2.
wp = lpcf/Nyq
ws = lpsf/Nyq
ord, Wn = sig.buttord(wp, ws, gpass, gstop)
b, a = sig.butter(ord, Wn, btype='lowpass')
def func(x):
return sig.lfilter(b,a,x)
return func
I use this function like
myfilt = lowbutter(20,30,400)
and then pass myfilt off to plotting or analysis code. You could
easily write a smooth_plot. Here is a sketch of how it might go
def smooth_plot(x, y, somefilt=lowbutter(20,30,400), **kwargs):
"""
plot x versus a smoothed version of y, using callable filter
myfilt. kwargs are passed on to plot
"""
y = myfilt(y)
plot(x, y, **kwargs)
For bandpass data, the equivalent of lowbutter that I use is
def bandpass(lpsf, lpcf, hpcf, hpsf, Fs, gpass=3, gstop=20):
"""
Return a butterworth bandpass filter
lpcf : lowpass corner freq
lpsf : lowpass stop freq
hpcf : highpass corner freq
hpsf : highpass stop freq
gpass : corner freq attenuation
gstop : stop freq attenuation
return value is a callable function that will filter your data
"""
Nyq = Fs/2.
wp = [lpcf/Nyq, hpcf/Nyq]
ws = [lpsf/Nyq, hpsf/Nyq]
ord, Wn = sig.buttord(wp, ws, gpass, gstop)
b,a = sig.butter(ord, Wn, btype='bandpass') # pun intended
def func(x):
return sig.lfilter(b,a,x)
return func
I don't think there could be any consensus on a default value for
myfilt since people work in very different time scales.
A short wiki entry on the scipy web site on how to do write plotting
functions with filtering built in along the lines of the examples
above would be useful.
http://www.scipy.org/wikis/topical_software/MatplotlibCookbook
If you would like to write one up, with example figures, that would be
great.
Tom> Any help would be greatly appreciated.
Tom> And, John and company thanks for a brilliant piece of
Tom> software.
Much obliged,
JDH
