One-Stop Shopping for MBARI Upper Water Column Data : Examples using pydap from Python to access BOG data via DRDS This page last changed on Jan 08, 2013 by mccann. ## Examples using pydap from Python NOTE: The DRDS web app must be installed in Tomcat on elvis for this to work. This was last done under apache-tomcat-6.0.18 and the current Tomcat on elvis is apache-tomcat-6.0.29. The example illustrated below is for getting data from just one table from BOG. There is a considerable overhead with configuring DRDS (https://oceana.mbari.org/confluence/display/OneStopShopping/installing+DRDS+and+connecting+to+BOG) and there are more direct ways to access all BOG data from Python using SQL or STOQS. -Mike McCann 8 Jan 2013. Please see http://pydap.org/client.html#accessing-sequential-data for where these examples came from. Below are examples accessing our data from elvis. Print out bottles where DEPTH is greater than 4300 Print out bottles where SAL is less than 28 Plot profiles of bottle data from near mooring M2 (a slightly more complex example using the Matplotlib package) #### Print out bottles where DEPTH is greater than 4300: Copy-n-paste into Python session:
    from pydap.client import open_url                                        # Use PyDAP client library from http://pydap.org/
    dataset = open_url('http://elvis.shore.mbari.org/dods/bog/BCTD')         # Read data directly from the database via OPeNDAP/DRDS
    print dataset.BCTD.keys()                                                # Print column names
    my_bottles = dataset.BCTD[(dataset.BCTD.DEPTH > 4300)]                   # Select bottles that are deeper than 4000
    print len(my_bottles['DEPTH'])                                           # Print length of my_bottles list
    for d,la,lo,id,t,o in zip(my_bottles.DEPTH, my_bottles.DEC_LAT, my_bottles.DEC_LONG, my_bottles.SITE_ID, my_bottles.TMP, my_bottles.O2):
       print d,la,lo,id,t,o
What it looks like when you execute the above:
    <106 elvis.shore.mbari.org /u/mccann> python
    Python 2.4.3 (#1, Jun 11 2009, 14:09:58)
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> from pydap.client import open_url                                        # Use PyDAP client library from http://pydap.org/
    >>> dataset = open_url('http://elvis.shore.mbari.org/dods/bog/BCTD')         # Read data directly from the database via OPeNDAP/DRDS
    >>> print dataset.BCTD.keys()                                                # Print column names
    ['CTD_BOTTLE_ID', 'CRUISE', 'EXPD', 'SEQ', 'DEPTH', 'BOTTLE', 'PROJECT', 'CTRB_ID', 'PLATFORM', 'RJDAY', 'DATE_TIME', 'JTIME', 'YEAR_DATE',
    'DEC_LAT', 'DEC_LONG', 'SITE_ID', 'PRESSURE', 'CHL_GFF', 'PHAEO_GFF', 'FOFA_GFF', 'VF_GFF', 'VE_GFF', 'SENS_GFF', 'FO_GFF', 'FA_GFF', 'FLUOR_RTO',
    'CHL_1u', 'PHAEO_1u', 'FOFA_1u', 'VF_1u', 'VE_1u', 'FO_1u', 'FA_1u', 'SENS_1u', 'CHL_5u', 'PHAEO_5u', 'FOFA_5u', 'VF_5u', 'VE_5u', 'SENS_5u', 'FO_5u',
    'FA_5u', 'TMP', 'SAL', 'CONDUCT', 'SIG_T', 'PARCOS', 'PAR4PI', 'TRANSMISS', 'CHLA', 'FLUOR', 'NH4', 'NO2', 'NO3', 'SIO4', 'PO4', 'TCO2', 'O2',
    'OXY_ML', 'OXY_PS', 'IRRD_490', 'IRRD_520', 'IRRD_555', 'ALTIMETER', 'rdep', 'sal2', 'temp2', 'cond2', 'pot_tmp', 'OxyT', 'OxyC', 'TransV',
    'TransBeam', 'POT_TMP2', 'OxyV', 'ISUS_NO3']
    >>> my_bottles = dataset.BCTD[(dataset.BCTD.DEPTH > 4300)]                   # Select bottles that are deeper than 4000
    >>> print len(my_bottles['DEPTH'])                                           # Print length of my_bottles list
    18
    >>> for d,la,lo,id,t,o in zip(my_bottles.DEPTH, my_bottles.DEC_LAT, my_bottles.DEC_LONG, my_bottles.SITE_ID, my_bottles.TMP, my_bottles.O2):
    ...    print d,la,lo,id,t,o
    ...

    4500 35.441 -124.89 67-90 1.5242 nan
    4500 35.457 -124.897 67-90 1.5183 nan
    4400 35.453 -124.901 67-90 1.5193 nan
    4500 35.453 -124.903 67-90 1.5199 nan
    4400 35.454 -124.905 67-90 1.5138 nan
    4370 35.459 -124.907 67-90 1.5212 nan
    4465 36.576 -125.741 60-90 1.5342 nan
    4380 35.467 -124.94 67-90 1.5182 nan
    4500 35.439 -124.89 67-90 1.5211 nan
    4335 35.458 -124.907 67-90 1.5175 nan
    4400 35.446 -124.919 67-90 1.5187 nan
    4400 35.45 -124.902 67-90 1.5146 nan
    4450 35.122 -125.605 67-100 1.5294 nan
    4450 35.122 -125.605 67-100 1.5296 nan
    4400 35.462 -124.91 67-90 1.5247 nan
    4400 35.455 -124.909 67-90 1.516 nan
    4500 35.453 -124.903 67-90 1.5253 nan
    4400 35.452 -124.911 67-90 1.515 nan
    >>>
#### Print out all bottle data with Salinity less than 28: Copy-n-paste into Python session:
    from pydap.client import open_url                                        # Use PyDAP client library from http://pydap.org/
    dataset = open_url('http://elvis.shore.mbari.org/dods/bog/BCTD')         # Read data directly from the database via OPeNDAP/DRDS
    print dataset.BCTD.keys()                                                # Print column names
    mb = dataset.BCTD[(dataset.BCTD.SAL < 28)]                               # Select bottles where Salinity is less than 28
    print len(mb['DEPTH'])                                                   # Print length of my_bottles list
    outText = "DATE_TIME, DEPTH, DEC_LAT, DEC_LONG, SITE_ID, TMP, SAL\n"     # Column headers
    for dt,d,la,lo,id,t,s in zip(mb.DATE_TIME, mb.DEPTH, mb.DEC_LAT, mb.DEC_LONG, mb.SITE_ID, mb.TMP, mb.SAL):
       outText = outText + "%s, %s, %s, %s, %s, %s, %s\n" % (dt, d, la, lo, id, t, s)        # Collect the data

    print outText
What it looks like when you execute the above:
    >>> from pydap.client import open_url                                        # Use PyDAP client library from http://pydap.org/
    >>> dataset = open_url('http://elvis.shore.mbari.org/dods/bog/BCTD')         # Read data directly from the database via OPeNDAP/DRDS
    >>> print dataset.BCTD.keys()                                                # Print column names
    ['CTD_BOTTLE_ID', 'CRUISE', 'EXPD', 'SEQ', 'DEPTH', 'BOTTLE', 'PROJECT', 'CTRB_ID', 'PLATFORM', 'RJDAY', 'DATE_TIME', 'JTIME',
    'YEAR_DATE', 'DEC_LAT', 'DEC_LONG', 'SITE_ID', 'PRESSURE', 'CHL_GFF', 'PHAEO_GFF', 'FOFA_GFF', 'VF_GFF', 'VE_GFF', 'SENS_GFF',
    'FO_GFF', 'FA_GFF', 'FLUOR_RTO', 'CHL_1u', 'PHAEO_1u', 'FOFA_1u', 'VF_1u', 'VE_1u', 'FO_1u', 'FA_1u', 'SENS_1u', 'CHL_5u',
    'PHAEO_5u', 'FOFA_5u', 'VF_5u', 'VE_5u', 'SENS_5u', 'FO_5u', 'FA_5u', 'TMP', 'SAL', 'CONDUCT', 'SIG_T', 'PARCOS', 'PAR4PI',
    'TRANSMISS', 'CHLA', 'FLUOR', 'NH4', 'NO2', 'NO3', 'SIO4', 'PO4', 'TCO2', 'O2', 'OXY_ML', 'OXY_PS', 'IRRD_490', 'IRRD_520',
    'IRRD_555', 'ALTIMETER', 'rdep', 'sal2', 'temp2', 'cond2', 'pot_tmp', 'OxyT', 'OxyC', 'TransV', 'TransBeam', 'POT_TMP2',
    'OxyV', 'ISUS_NO3']
    >>> mb = dataset.BCTD[(dataset.BCTD.SAL < 28)]                               # Select bottles where Salinity is less than 28
    >>> print len(mb['DEPTH'])                                                   # Print length of my_bottles list
    19
    >>> outText = "DATE_TIME, DEPTH, DEC_LAT, DEC_LONG, SITE_ID, TMP, SAL\n"     # Column headers
    >>> for dt,d,la,lo,id,t,s in zip(mb.DATE_TIME, mb.DEPTH, mb.DEC_LAT, mb.DEC_LONG, mb.SITE_ID, mb.TMP, mb.SAL):
    ...    outText = outText + "%s, %s, %s, %s, %s, %s, %s\n" % (dt, d, la, lo, id, t, s)        # Collect the data
    ...
    >>> print outText
    DATE_TIME, DEPTH, DEC_LAT, DEC_LONG, SITE_ID, TMP, SAL
    2007-01-28 02:15:37.0, 10, 37.555, -122.191, 38, 9.0597, 27.5771
    2007-01-28 02:15:37.0, 10, 37.555, -122.191, 38, 9.0607, 27.5745
    2007-01-28 02:42:04.0, 10, 37.569, -122.219, 39, 9.093, 27.7954
    2007-01-28 02:42:04.0, 10, 37.569, -122.219, 39, 9.0929, 27.7957
    2007-01-28 03:04:38.0, 10, 37.58, -122.244, 40, 9.1872, 27.994
    2007-01-28 03:04:38.0, 10, 37.58, -122.244, 40, 9.1877, 27.9945
    2007-01-28 11:13:18.0, 0, 37.978, -122.43, 54, 9.1868, 25.3831
    2007-01-28 11:36:34.0, 0, 38.007, -122.404, 55, 9.2646, 25.4848
    2007-01-28 11:57:32.0, 5, 38.028, -122.37, 56, 9.3301, 26.1335
    2007-01-28 11:57:32.0, 5, 38.028, -122.37, 56, 9.3298, 26.1474
    2007-01-28 12:53:28.0, 20, 38.062, -122.263, 58, 9.1294, 24.1165
    2007-01-28 12:53:28.0, 20, 38.062, -122.263, 58, 9.1296, 24.1172
    2007-01-28 12:28:13.0, 5, 38.051, -122.313, 57, 9.2559, 25.5208
    2007-01-28 12:28:13.0, 5, 38.051, -122.313, 57, 9.2593, 25.5637
    2006-04-17 08:33:43.0, 10, 47.775, -124.648, 13.3 -2.0, 10.22, 27.4995
    2006-04-17 08:33:43.0, 5, 47.775, -124.648, 13.3 -2.0, 10.2026, 27.4343
    2006-04-17 08:33:43.0, 0, 47.775, -124.648, 13.3 -2.0, 10.1847, 27.4071
    2006-04-19 00:13:59.0, 5, 46.429, -124.222, 20.0 3.0, 10.3676, 23.8885
    2006-04-19 00:13:59.0, 0, 46.429, -124.222, 20.0 3.0, 10.8401, 21.1543
#### Plot profiles of bottle data from near mooring M2 (a slightly more complex example using the Matplotlib package): Copy-n-paste into Python session:
    from pydap.client import open_url                                        # Use PyDAP client library from http://pydap.org/
    from pylab import *                                                      # Use Matlab-like plotting module
    dataset = open_url('http://elvis.shore.mbari.org/dods/bog/BCTD')         # Read data directly from the database via OPeNDAP/DRDS
    # From using Google Earth to get bounding box around M2's location: BBOX=-122.413310,36.673487,-122.357704,36.7042573
    m2bottles = dataset.BCTD[
       (dataset.BCTD.DEC_LONG > -122.413310) &
       (dataset.BCTD.DEC_LONG < -122.357704) &
       (dataset.BCTD.DEC_LAT > 36.673487) &
       (dataset.BCTD.DEC_LAT < 36.7042573) ]

    # Loop through query results and build dictionary keyed on profile (DATE_TIME is a useful proxy)
    # Create a dictionaries of lists for thess data structures
    depthList = dict()
    oxyList = dict()
    for dt in m2bottles.DATE_TIME:
       depthList[dt] = list()
       oxyList[dt] = list()

    # Now append to these lists.  This creates the 'arrays' that we can pass to the plot routine.
    for (dt,d,o) in (zip(m2bottles.DATE_TIME, m2bottles.DEPTH, m2bottles.OXY_ML)):
       depthList[dt].append(d)
       oxyList[dt].append(o)

    # Order the time list
    dtList = depthList.keys()
    dtList.sort()

    # Plot point from the profiles in time order
    # To make it a little interesting color code the points for before and after the year 2000
    fig = figure()
    for dt in dtList:
       print "Plotting profile collected on " + dt
       print oxyList[dt], depthList[dt]
       if int(dt[0:4]) > 2000:
          plot(oxyList[dt], depthList[dt], 'b*')
       else:
          plot(oxyList[dt], depthList[dt], 'r*')
       #axis([0, 9, 0, 1200])
       ax = gca()
       ax.set_ylim(ax.get_ylim()[::-1])         # Reverse the depth axis

    xlabel('Oxygen (ml/l)')
    ylabel('Depth (m)')
    title("Mooring M2 Bottle Data: " + dtList[0].split(' ')[0] + " to " + dtList[-1].split(' ')[0])
    text(5, 800, 'Blue: Before year 2000\nRed: After Year 2000')

    show()

    fig.savefig("M2_oxy.png")
Produces this figure: And the output of the above set of python commands:
     <121 elvis.shore.mbari.org /u/ssdsadmin> python
    Python 2.4.3 (#1, Jun 11 2009, 14:09:58)
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from pydap.client import open_url                                        # Use PyDAP client library from http://pydap.org/
    >>> from pylab import *                                                      # Use Matlab-like plotting module
    >>> dataset = open_url('http://elvis.shore.mbari.org/dods/bog/BCTD')         # Read data directly from the database via OPeNDAP/DRDS
    >>> # From using Google Earth to get bounding box around M2's location: BBOX=-122.413310,36.673487,-122.357704,36.7042573
    ... m2bottles = dataset.BCTD[
    ...    (dataset.BCTD.DEC_LONG > -122.413310) &
    ...    (dataset.BCTD.DEC_LONG < -122.357704) &
    ...    (dataset.BCTD.DEC_LAT > 36.673487) &
    ...    (dataset.BCTD.DEC_LAT < 36.7042573) ]
    >>>
    >>> # Loop through query results and build dictionary keyed on profile (DATE_TIME is a useful proxy)
    ... # Create a dictionaries of lists for thess data structures
    ... depthList = dict()
    >>> oxyList = dict()
    >>> for dt in m2bottles.DATE_TIME:
    ...    depthList[dt] = list()
    ...    oxyList[dt] = list()
    ...
    >>> # Now append to these lists.  This creates the 'arrays' that we can pass to the plot routine.
    ... for (dt,d,o) in (zip(m2bottles.DATE_TIME, m2bottles.DEPTH, m2bottles.OXY_ML)):
    ...    depthList[dt].append(d)
    ...    oxyList[dt].append(o)
    ...
    >>> # Plot point from the profiles in time order, color code according to date
    ... dtList = depthList.keys()
    >>> dtList.sort()
    >>>
    >>> fig = figure()
    >>> for dt in dtList:
    ...    print "Plotting profile collected on " + dt
    ...    print oxyList[dt], depthList[dt]
    ...    if int(dt[0:4]) > 2000:
    ...       plot(oxyList[dt], depthList[dt], 'b*')
    ...    else:
    ...       plot(oxyList[dt], depthList[dt], 'r*')
    ...    #axis([0, 9, 0, 1200])
    ...    ax = gca()
    ...    ax.set_ylim(ax.get_ylim()[::-1])         # Reverse the depth axis
    ...
    Plotting profile collected on 1993-03-10 21:46:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ac3f8c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1993-07-21 19:41:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ada84c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1993-10-06 19:50:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9adaa4c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1993-10-27 18:46:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9adac4c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1993-11-23 21:18:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9adae4c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1993-12-15 21:01:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9adaeac>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1993-12-29 18:23:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ae326c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1994-01-26 20:03:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 200]
    [<matplotlib.lines.Line2D object at 0x9ae346c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1994-02-23 19:03:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ae366c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1994-03-09 19:53:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ae386c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1994-03-23 20:45:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ae3a6c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1994-04-13 18:44:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ae3c6c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1994-05-18 18:12:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [5, 10, 20, 30, 40, 60, 80, 100, 150, 200, 0]
    [<matplotlib.lines.Line2D object at 0x9ae3e6c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1994-06-29 18:50:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9ae3ecc>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1994-07-20 18:57:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aeb28c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1994-08-11 20:01:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aeb48c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1994-09-28 19:43:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aeb68c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1994-10-19 18:33:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aeb88c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1994-12-21 19:02:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aeba8c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-02-09 00:03:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aebc8c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-03-01 20:27:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aebe8c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-03-15 19:09:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9aebeec>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-03-29 20:43:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [10, 20, 30, 40, 60, 80, 100, 150, 200, 0, 5]
    [<matplotlib.lines.Line2D object at 0x9af22ac>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-04-23 04:12:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9af24ac>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-05-02 20:27:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9af26ac>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-05-24 19:52:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9af28ac>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-06-14 21:06:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9af2aac>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-06-28 18:09:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9af2cac>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-07-12 18:45:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [20, 30, 40, 60, 80, 100, 150, 200, 0, 5, 10]
    [<matplotlib.lines.Line2D object at 0x9af2eac>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-07-26 20:24:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 200]
    [<matplotlib.lines.Line2D object at 0x9af2f0c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-08-09 18:46:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 200]
    [<matplotlib.lines.Line2D object at 0x9b422cc>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-08-23 17:57:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b424cc>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-09-13 20:36:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b426cc>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-09-27 18:58:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b428cc>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-10-11 19:18:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b42acc>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1995-10-25 19:01:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b42ccc>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1995-11-15 19:40:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b42ecc>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1996-01-03 19:46:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b42f2c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1996-02-14 20:53:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4a2ec>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1996-04-03 20:41:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4a4ec>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1996-06-06 00:35:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4a6ec>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1996-08-06 18:57:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4a8ec>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1996-08-27 19:51:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4aaec>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1996-09-17 19:29:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4acec>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1996-10-09 18:37:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4aeec>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1996-10-30 20:40:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b4af4c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1997-03-04 22:30:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 40, 60, 80, 100, 150, 700, 200]
    [<matplotlib.lines.Line2D object at 0x9b5230c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1997-05-07 19:02:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 15, 20, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b5250c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1997-06-03 13:45:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [100, 150, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 80]
    [<matplotlib.lines.Line2D object at 0x9b5270c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1997-06-03 15:09:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 0, 5, 5, 10, 10, 20, 20, 30, 30, 40, 60]
    [<matplotlib.lines.Line2D object at 0x9b5290c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1997-06-18 19:31:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 60, 80, 100, 200, 500]
    [<matplotlib.lines.Line2D object at 0x9b52b0c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1997-07-29 11:25:00.0
    [nan, nan, nan, nan] [0, 0, 1000, 1000]
    [<matplotlib.lines.Line2D object at 0x9b52d0c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1997-07-30 18:33:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b52f0c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1997-08-11 19:28:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [5, 10, 20, 30, 40, 60, 80, 100, 150, 200, 0]
    [<matplotlib.lines.Line2D object at 0x9b52f6c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1997-10-22 18:33:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b5932c>]
    (0.059999999999999998, -0.059999999999999998)
    Plotting profile collected on 1997-11-12 19:28:00.0
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] [0, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200]
    [<matplotlib.lines.Line2D object at 0x9b5952c>]
    (-0.059999999999999998, 0.059999999999999998)
    Plotting profile collected on 1998-01-22 02:17:00.0

    (long lines from original output removed)

    [<matplotlib.lines.Line2D object at 0x9c4a50c>]
    (1200.0, 0.0)
    >>>
    >>> xlabel('Oxygen (ml/l)')
    <matplotlib.text.Text object at 0x997836c>
    >>> ylabel('Depth (m)')
    <matplotlib.text.Text object at 0x9978dac>
    >>> title("Mooring M2 Bottle Data: " + dtList[0].split(' ')[0] + " to " + dtList[-1].split(' ')[0])
    <matplotlib.text.Text object at 0x9ab57ac>
    >>> text(5, 800, 'Blue: Before year 2000\nRed: After Year 2000')
    <matplotlib.text.Text object at 0x987ee6c>
    >>>
    >>> show()
    >>>
    >>> fig.savefig("M2_oxy.png")
Attachments: M2_oxy.png (image/png)

Document generated by Confluence on Feb 04, 2026 08:40