Smoothed lines

I follow this list rather closely so I am hoping that I

    > haven't missed something obvious here.

    > I am trying to plot a line graph with pylab.plot. I was
    > wondering if there is an easy way to plot a smoothed line
    > graph like excel does by default. I could obviously apply a
    > signal filter but I was wondering if there is a simple user
    > friendly way to get something like excel does in matplotlb
    > 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.

    > Any help would be greatly appreciated.

    > And, John and company thanks for a brilliant piece of
    > software.

Much obliged,
JDH