Display objects

A striplog depends on a hierarchy of objects. This notebook shows the objects related to display:

  • Decor: One element from a legend — describes how to display a Rock.
  • Legend: A set of Decors — describes how to display a set of Rocks or a Striplog.

Decor


In [1]:
from striplog import Decor

A Decor attaches a display style to a Rock.


In [2]:
print(Decor.__doc__)


    A single display style. A Decor describes how to display a given set
    of Component properties.

    In general, you will not usually use a Decor on its own. Instead, you
    will want to use a Legend, which is just a list of Decors, and leave
    the Decors to the Legend.

    Args:
      params (dict): The parameters you want in the Decor. There must be a
        Component to attach the decoration to, and at least 1 other attribute.
        It's completely up to you, but you probably want at least a colour
        (hex names like #AAA or #d3d3d3, or matplotlib's English-language
        names listed at http://ageo.co/modelrcolour are acceptable.

        The only other parameter the class recognizes for now is 'width',
        which is the width of the striplog element.

    Example:
      my_rock = Component({ ... })
      d = {'component': my_rock, 'colour': 'red'}
      my_decor = Decor(d)
    

We are going to need a Component to make a Decor.


In [3]:
from striplog import Component
r = {'colour': 'grey',
     'grainsize': 'vf-f',
     'lithology': 'sand',
     'porosity': 0.123
    }
rock = Component(r)
rock


Out[3]:
colourgrey
grainsizevf-f
lithologysand
porosity0.123

In [4]:
d = {'color': '#267022',
     'component': rock,
     'width': 3}
decor = Decor(d)
decor


Out[4]:
colour#267022
component
colourgrey
grainsizevf-f
lithologysand
porosity0.123
width3.0
hatchNone

In [5]:
from striplog import Component
r = {'colour': 'grey',
     'grainsize': 'vf-f',
     'lithology': 'sand',
     'porosity': 0.123
    }
rock = Component(r)
rock


Out[5]:
colourgrey
grainsizevf-f
lithologysand
porosity0.123

Like Rocks, we instantiate Decors with a dict of properties:


In [6]:
d = {'color': '#267022',
     'component': rock,
     'width': 3}
decor = Decor(d)
decor


Out[6]:
colour#267022
component
colourgrey
grainsizevf-f
lithologysand
porosity0.123
width3.0
hatchNone

Or instantiate with keyword parameters:


In [7]:
Decor(colour='#86f0b6', component=Component({'colour': 'grey', 'grainsize': 'vf-f', 'porosity': 0.123, 'lithology': 'sand'}), width=3.0)


Out[7]:
colour#86f0b6
component
colourgrey
grainsizevf-f
porosity0.123
lithologysand
width3.0
hatchNone

You can access its attributes. It has two ways to understand colour:


In [8]:
print("Hex: {}... and RGB: {}".format(decor.colour, decor.rgb))


Hex: #267022... and RGB: (38, 112, 34)

In [9]:
print(decor)


Decor({'_colour': '#267022', 'component': Component({'colour': 'grey', 'grainsize': 'vf-f', 'lithology': 'sand', 'porosity': 0.123}), 'width': 3.0, 'hatch': None})

In [10]:
%matplotlib inline
decor.plot()



In [11]:
decor.hatch = '+'
decor.plot()


There are the standard matplotlib hatch patterns:


In [12]:
hatches = "\/|+x-.o*"
for h in hatches:
    Decor({'component': Component({'hatch':h}), 'hatch': h, 'colour': '#eeeeee'}).plot()


And there are some custom ones. These really need to be reconciled and implemented in a more flexible way, perhaps even going as far as a redesign of the mpl implementation.


In [13]:
hatches = "pctLbs!=v^"
for h in hatches:
    Decor({'component': Component({'hatch':h}), 'hatch': h, 'colour': '#eeeeee'}).plot(fmt="{hatch}")


We can disaply hatches in a single plot for quick reference:


In [14]:
import matplotlib.pyplot as plt

hatches = ['.', '..', 'o', 'p', 'c', '*', '-', '--', '=', '==', '|',
            '||', '!', '!!', '+', '++', '/', '\\', '//', '\\\\', '///',
            '\\\\\\', 'x', 'xx', '^', 'v', 't', 'l', 'b', 's']

fig, axs = plt.subplots(figsize=(16,5.25), ncols=10, nrows=3)
fig.subplots_adjust(hspace=0.5)

for ax, h in zip(axs.flatten(), hatches):
    ax.set_title(h)
    Decor(colour='#eeeeee', 
          component=Component({'hatch': h}), 
          hatch=h).plot(fmt='', ax=ax)



Legend


In [15]:
from striplog import Legend
print(Legend.__doc__)


    A look-up table to assist in the conversion of Components to
    a plot colour.

    Args:
        list_of_Decors (list): The decors to collect into a legend. In
            general, you will want to leave legend building to the constructor
            class methods, `Legend.default()`, and
            `Legend.from_csv(text=string)`. We can add others over time, such
            as `from_xls` and so on.
    

We'll define a legend in a CSV file. I can't think of a better way for now. It would be easy to make a web form to facilitate this with, for example, a colour picker. It may not be worth it, though; I imagine one would create one and then leave it alone most of the time.


In [16]:
l = u"""colour, width, component lithology, component colour, component grainsize
#F7E9A6, 3, Sandstone, Grey, VF-F
#FF99CC, 2, Anhydrite, , 
#DBD6BC, 3, Heterolithic, Grey, 
#FF4C4A, 2, Volcanic, , 
#86F0B6, 5, Conglomerate, , 
#FF96F6, 2, Halite, , 
#F2FF42, 4, Sandstone, Grey, F-M
#DBC9BC, 3, Heterolithic, Red, 
#A68374, 2, Siltstone, Grey, 
#A657FA, 3, Dolomite, , 
#FFD073, 4, Sandstone, Red, C-M
#A6D1FF, 3, Limestone, , 
#FFDBBA, 3, Sandstone, Red, VF-F
#FFE040, 4, Sandstone, Grey, C-M
#A1655A, 2, Siltstone, Red, 
#363434, 1, Coal, , 
#664A4A, 1, Mudstone, Red, 
#666666, 1, Mudstone, Grey, """

In [17]:
legend = Legend.from_csv(text=l)
legend[:5]


Out[17]:
colourhatchcomponentwidth
#f7e9a6None
lithologysandstone
colourgrey
grainsizevf-f
3.0
#ff99ccNone
lithologyanhydrite
2.0
#dbd6bcNone
lithologyheterolithic
colourgrey
3.0
#ff4c4aNone
lithologyvolcanic
2.0
#86f0b6None
lithologyconglomerate
5.0

Duplicate lithologies will result in a warning. To avoid strange results, you should fix the problem by removing duplicates.


In [18]:
l = u"""colour, component lithology
#F7E9A6, Sandstone
#F2FF42, Sandstone
#FF99CC, Anhydrite
#DBD6BC, Heterolithic 
#FF4C4A, Volcanic
#86F0B6, Conglomerate
#FFD073, Sandstone
"""

In [19]:
Legend.from_csv(text=l)


/home/geodev/anaconda3/envs/geocomp/lib/python3.7/site-packages/striplog/legend.py:621: UserWarning: This legend contains duplicate components.
  warnings.warn(w)
/home/geodev/anaconda3/envs/geocomp/lib/python3.7/site-packages/striplog/legend.py:621: UserWarning: This legend contains duplicate components.
  warnings.warn(w)
Out[19]:
colourhatchcomponentwidth
#f7e9a6None
lithologysandstone
None
#f2ff42None
lithologysandstone
None
#ff99ccNone
lithologyanhydrite
None
#dbd6bcNone
lithologyheterolithic
None
#ff4c4aNone
lithologyvolcanic
None
#86f0b6None
lithologyconglomerate
None
#ffd073None
lithologysandstone
None

We can also export a legend as CSV text:


In [20]:
print(legend.to_csv())


colour,hatch,width,component lithology,component colour,component grainsize
#f7e9a6,None,3.0,sandstone,grey,vf-f,
#ff99cc,None,2.0,anhydrite,,,
#dbd6bc,None,3.0,heterolithic,grey,,
#ff4c4a,None,2.0,volcanic,,,
#86f0b6,None,5.0,conglomerate,,,
#ff96f6,None,2.0,halite,,,
#f2ff42,None,4.0,sandstone,grey,f-m,
#dbc9bc,None,3.0,heterolithic,red,,
#a68374,None,2.0,siltstone,grey,,
#a657fa,None,3.0,dolomite,,,
#ffd073,None,4.0,sandstone,red,c-m,
#a6d1ff,None,3.0,limestone,,,
#ffdbba,None,3.0,sandstone,red,vf-f,
#ffe040,None,4.0,sandstone,grey,c-m,
#a1655a,None,2.0,siltstone,red,,
#363434,None,1.0,coal,,,
#664a4a,None,1.0,mudstone,red,,
#666666,None,1.0,mudstone,grey,,

Builtin legends

There are several:

'nsdoe': Nova Scotia Dept. of Energy
'nagmdm__6_2': USGS N. Am. Geol. Map Data Model 6.2 <<< default
'nagmdm__6_1': USGS N. Am. Geol. Map Data Model 6.1
'nagmdm__4_3': USGS N. Am. Geol. Map Data Model 4.3
'sgmc': USGS State Geologic Map Compilation

In [21]:
legend = Legend.builtin('nsdoe')
legend


Out[21]:
colourhatchcomponentwidth
#f7e9a6None
lithologysandstone
colourgrey
grainsizevf-f
3.0
#ff99ccNone
lithologyanhydrite
2.0
#dbd6bcNone
lithologyheterolithic
colourgrey
3.0
#ff4c4aNone
lithologyvolcanic
2.0
#86f0b6None
lithologyconglomerate
5.0
#ff96f6None
lithologyhalite
2.0
#f2ff42None
lithologysandstone
colourgrey
grainsizef-m
4.0
#dbc9bcNone
lithologyheterolithic
colourred
3.0
#a68374None
lithologysiltstone
colourgrey
2.0
#a657faNone
lithologydolomite
3.0
#ffd073None
lithologysandstone
colourred
grainsizec-m
4.0
#a6d1ffNone
lithologylimestone
3.0
#ffdbbaNone
lithologysandstone
colourred
grainsizevf-f
3.0
#ffe040None
lithologysandstone
colourgrey
grainsizec-m
4.0
#a1655aNone
lithologysiltstone
colourred
2.0
#363434None
lithologycoal
1.0
#664a4aNone
lithologymudstone
colourred
1.0
#666666None
lithologymudstone
colourgrey
1.0

There is also a default legend, which you can call with Legend.default() (no arguments).


In [22]:
Legend.default()


Out[22]:
colourhatchcomponentwidth
#fdf43fNone
lithologyunconsolidated material
None
#ffff89None
lithologyalluvium
None
#ffffd5None
lithologyflood plain
None
#fffae9None
lithologylevee
None
#fffac8None
lithologydelta
None
#ffffb7None
lithologyalluvial fan
None
#faee7aNone
lithologyalluvial terrace
None
#f4efe4None
lithologylake or marine sediment
None
#f1e5dfNone
lithologyplaya
None
#e4d0beNone
lithologymud flat
None
#e4d8beNone
lithologybeach sand
None
#fff6d9None
lithologyterrace
None
#e0c59eNone
lithologyeolian material
None
#e0d2b4None
lithologydune sand
None
#dbcca9None
lithologysand sheet
None
#f5e1bdNone
lithologyloess
None
#e0b09eNone
lithologyvolcanic ash
None
#cfbb8fNone
lithologymass wasting material
None
#e1e3c3None
lithologycolluvium
None
#e5dbb3None
lithologymudflow
None
#dcd5b4None
lithologylahar
None
#d3ca9fNone
lithologydebris flow
None
#c9be89None
lithologylandslide
None
#bcaf6cNone
lithologytalus
None
#bfa743None
lithologyglacial drift
None
#d2c27cNone
lithologytill
None
#ffeebfNone
lithologymoraine
None
#ffe59dNone
lithologystratified glacial sediment
None
#ffdf85None
lithologyglacial outwash sediment
None
#fee670None
lithologysub/supra-glacial sediment
None
#fee258None
lithologyglaciolacustrine sediment
None
#fedb2eNone
lithologyglacial-marine sediment
None
#f7f3a1None
lithologybiogenic rock
None
#ffcf81None
lithologypeat
None
#ffcc99None
lithologycoral
None
#ffe389None
lithologyresiduum
None
#ffdb67None
lithologyclay or mud
None
#ffd345None
lithologysilt
None
#ffcb23None
lithologysand
None
#ecb400None
lithologygravel
None
#92dcb7None
lithologysedimentary rock
None
#d9fdd3None
lithologyclastic rock
None
#cfefdfNone
lithologymudstone
None
#d5e6ccNone
lithologyclaystone
None
#c0d0c0None
lithologybentonite
None
#ace4c8None
lithologyshale
None
#dbfebcNone
lithologyblack shale
None
#bbffddNone
lithologyoil shale
None
#e1f0d8None
lithologyargillite
None
#d6fe9aNone
lithologysiltstone
None
#95ffcaNone
lithologyfine-grained mixed clastic rock
None
#cdffd9None
lithologysandstone
None
#a6fcaaNone
lithologyarenite
None
#cbefceNone
lithologyorthoquartzite
None
#9acefeNone
lithologycalcarenite
None
#69cf9cNone
lithologyarkose
None
#bddbf1None
lithologywacke
None
#b8eac3None
lithologygraywacke
None
#90a565None
lithologymedium-grained mixed clastic rock
None
#b7d9ccNone
lithologyconglomerate
None
#a7ba86None
lithologysedimentary breccia
None
#a5aaadNone
lithologycoarse-grained mixed clastic rock
None
#8dbecdNone
lithologyolistostrome
None
#bbc0c5None
lithologymelange
None
#56e0fcNone
lithologycarbonate rock
None
#43aff9None
lithologylimestone
None
#6bc3ffNone
lithologydolostone
None
#38b4b1None
lithologymixed carbonate/clastic rock
None
#60ccbfNone
lithologymixed volcanic/clastic rock
None
#bfe3dcNone
lithologyphosphorite
None
#cddeffNone
lithologychemical sedimentary rock
None
#019ccdNone
lithologyevaporite
None
#9abfc0None
lithologychert
None
#c0aeb6None
lithologynovaculite
None
#b99598None
lithologyiron formation
None
#d9c2a3None
lithologyexhalite
None
#820041None
lithologycoal
None
#6e4909None
lithologymixed coal and clastic rock
None
#fc6e7cNone
lithologyplutonic rock
None
#ffc1b7None
lithologyaplite
None
#ffe1e8None
lithologyporphyry
None
#e45891None
lithologylampophyre
None
#ffeff3None
lithologypegmatite
None
#dd2972None
lithologygranitoid
None
#ffd1dcNone
lithologyalkali-feldspar granite
None
#f9b5bbNone
lithologygranite
None
#f8beaeNone
lithologyperaluminous granite
None
#ffb3c5None
lithologymetaluminous granite
None
#ff6f6bNone
lithologysubaluminous granite
None
#fc5262None
lithologyperalkaline granite
None
#e979a6None
lithologygranodiorite
None
#fcb6b6None
lithologytonalite
None
#ffa7bcNone
lithologytrondhjemite
None
#f43c6cNone
lithologyalkali-feldpar syenite
None
#fb2338None
lithologyquartz syenite
None
#f41a87None
lithologysyenite
None
#ff6388None
lithologyquartz monzonite
None
#ff275aNone
lithologymonzonite
None
#ff819fNone
lithologyquartz monzodiorite
None
#ffa99dNone
lithologymonzodiorite
None
#e81c00None
lithologyquartz diorite
None
#ff3317None
lithologydiorite
None
#d60000None
lithologydiabase
None
#ac0000None
lithologygabbroid
None
#ff6f5bNone
lithologyquartz monzogabbro
None
#e377adNone
lithologymonzogabbro
None
#eda7caNone
lithologyquartz gabbro
None
#e993beNone
lithologygabbro
None
#ffd6d1None
lithologynorite
None
#ffbfceNone
lithologytroctolite
None
#ff95aeNone
lithologyanorthosite
None
#ff6f91None
lithologyalkalic intrusive rock
None
#ff1b51None
lithologynepheline syenite
None
#e80037None
lithologyultramafic intrusive rock
None
#ce0031None
lithologyperidotite
None
#b0002aNone
lithologydunite
None
#c1010aNone
lithologykimberlite
None
#940023None
lithologypyroxenite
None
#a30109None
lithologyhornblendite
None
#750107None
lithologyintrusive carbonatite
None
#ffb7deNone
lithologyvolcanic rock
None
#ffc3e4None
lithologyglassy volcanic rock
None
#ffd1eaNone
lithologyobsidian
None
#ffc3f8None
lithologyvitrophyre
None
#ffe5f3None
lithologypumice
None
#ffe0deNone
lithologypyroclastic
None
#f9d3d3None
lithologytuff
None
#fff3c9None
lithologywelded tuff
None
#ffefd9None
lithologyash-flow tuff
None
#ffe5c3None
lithologyignimbrite
None
#ffd59dNone
lithologyvolcanic breccia
None
#ffa227None
lithologylava flow
None
#ffc16fNone
lithologybimodal suite
None
#f48b00None
lithologyfelsic volcanic rock
None
#fedc7eNone
lithologyalkali-feldspar rhyolite
None
#fecc68None
lithologyrhyolite
None
#fec62aNone
lithologyrhyodacite
None
#fecdacNone
lithologydacite
None
#feb786None
lithologyalkali-feldspar trachyte
None
#fea060None
lithologytrachyte
None
#fe8736None
lithologyquartz latite
None
#fe7518None
lithologylatite
None
#eb6001None
lithologyintermediate volcanic rock
None
#c95201None
lithologytrachyandesite
None
#b14801None
lithologyandesite
None
#933c01None
lithologymafic volcanic rock
None
#ecd5c6None
lithologytrachybasalt
None
#ddb397None
lithologybasalt
None
#d39d79None
lithologytholeite
None
#c68050None
lithologyhawaiite
None
#a96537None
lithologyalkaline basalt
None
#c24100None
lithologyalkalic volcanic rock
None
#5f391fNone
lithologyphonolite
None
#854f2bNone
lithologytephrite
None
#a03500None
lithologyultramafitite
None
#6e2500None
lithologyvolcanic carbonatite
None
#a7a7ffNone
lithologymetamorphic rock
None
#eaafffNone
lithologyhornfels
None
#7dff7dNone
lithologymetasedimentary rock
None
#c9ffc9None
lithologymeta-argillite
None
#e6cdffNone
lithologyslate
None
#9fff9fNone
lithologyquartzite
None
#e9ffe9None
lithologymetaconglomerate
None
#0000ffNone
lithologymarble
None
#ff57ffNone
lithologymetavolcanic rock
None
#ff8dffNone
lithologyfelsic metavolcanic rock
None
#ffa7ffNone
lithologymetarhyolite
None
#fe6700None
lithologykeratophyre
None
#ff0000None
lithologyintermediate metavolcanic rock
None
#b93b68None
lithologymafic metavolcanic rock
None
#872b4cNone
lithologymetabasalt
None
#c9557eNone
lithologyspilite
None
#008000None
lithologygreenstone
None
#b4cfe4None
lithologyphyllite
None
#dbdbe7None
lithologyschist
None
#ededf3None
lithologygreenschist
None
#c0c0c0None
lithologyblueschist
None
#b1b1b1None
lithologymica schist
None
#cacadcNone
lithologypelitic schist
None
#a2a2c0None
lithologyquartz-feldspar schist
None
#b6b6ceNone
lithologycalc-silicate schist
None
#969696None
lithologyamphibole schist
None
#a337fdNone
lithologygranofels
None
#ecd6feNone
lithologygneiss
None
#e0bcfeNone
lithologyfelsic gneiss
None
#d5a4feNone
lithologygranitic gneiss
None
#c886feNone
lithologybiotite gneiss
None
#ccb7ffNone
lithologymafic gneiss
None
#b395ffNone
lithologyorthogneiss
None
#9063ffNone
lithologyparagneiss
None
#9f00caNone
lithologymigmatite
None
#7b009cNone
lithologyamphibolite
None
#6a006aNone
lithologygranulite
None
#ce9dffNone
lithologyeclogite
None
#a449ffNone
lithologygreisen
None
#8103ffNone
lithologyskarn
None
#46008cNone
lithologycalc-silicate rock
None
#005c00None
lithologyserpentinite
None
#84613eNone
lithologytectonite
None
#d0cbb0None
lithologytectonic melange
None
#b0a778None
lithologytectonic breccia
None
#887f50None
lithologycataclasite
None
#ac7f50None
lithologyphyllonite
None
#6d5033None
lithologymylonite
None
#64020bNone
lithologyflaser gneiss
None
#887f50None
lithologyaugen gneiss
None

There are also default timescales:


In [23]:
time = Legend.default_timescale()
time[:10]


Out[23]:
colourhatchcomponentwidth
#6fdaedNone
agephanerozoic
None
#f6ec39None
agecenozoic
None
#fef691None
agequaternary
None
#f2f902None
agetertiary
None
#fedd2dNone
ageneogene
None
#fef1e0None
ageholocene
None
#feefb8None
agepleistocene
None
#fef1d6None
ageupper pleistocene
None
#fef1d6None
agetarantian
None
#fef0ccNone
agemiddle pleistocene
None

Legend from image


In [24]:
from IPython.display import Image
Image('z_Lithology_legend_gapless2.png', width=15)


Out[24]:

In [25]:
liths = [
'Conglomerate', 
'Sandstone',
'Sandstone',
'Sandstone',
'Sandstone',
'Sandstone',
'Siltstone',
'Siltstone',
'Heterolithic',
'Heterolithic',
'Mudstone',
'Mudstone',
'Limestone',
'Dolomite',
'Anhydrite',
'Halite',
'Coal',
'Volcanic',
'NULL',
]

colours = [
None, 
'Grey',
'Red',
'Grey',
'Grey',
'Red',
'Grey',
'Red',
'Grey',
'Red',
'Grey',
'Red',
None, 
None, 
None, 
None, 
None, 
None, 
None, 
]

In [26]:
components = [Component({'lithology': l, 'colour': c}) for l, c in zip(liths, colours)]

In [27]:
Legend.from_image('z_Lithology_legend_gapless2.png', components).plot()


Querying a legend

The legend is basically a query table. We can ask the Legend what colour to use for a given Rock object:


In [28]:
legend.get_colour(rock)


Out[28]:
'#eeeeee'

In [29]:
rock3 = Component({'colour': 'red',
           'grainsize': 'vf-f',
           'lithology': 'sandstone'})
legend.get_colour(rock3)


Out[29]:
'#ffdbba'

In [30]:
Legend.random(rock3)


Out[30]:
colourhatchcomponentwidth
#5ff68bNone
colourred
grainsizevf-f
lithologysandstone
None

Sometimes we also want to use a width for a given lithology:


In [31]:
legend.get_width(rock3)


Out[31]:
3.0

We can also ask the legend which Rock is represented by a particular colour. (I doubt you'd ever really need to do this, but I had to implement this to allow you to make a Striplog from an image: it looks up the rocks to use by colour.)


In [32]:
legend.get_component('#f7e9a6')


Out[32]:
lithologysandstone
colourgrey
grainsizevf-f

The Legend behaves more or less like a list, so we can index into it:


In [33]:
legend[3:5]


Out[33]:
colourhatchcomponentwidth
#ff4c4aNone
lithologyvolcanic
2.0
#86f0b6None
lithologyconglomerate
5.0

Legends can plot themselves.


In [34]:
legend.plot()


Sometimes you don't want to have to make a legend, so you can use a random one. Just pass a list of Components...


In [35]:
# We'll scrape a quick list of 7 components from the default legend:
c = [d.component for d in legend[:7]]

l = Legend.random(c)
l.plot()


There is a default colour table for geological timescales too... it's based on the Wikipedia's colour scheme for the geological timetable.


In [36]:
time[74:79].plot(fmt="{age!t}")  # Pass a format for proper case


Hatch patterns


In [37]:
hatchy = """colour,width,hatch,component colour,component grainsize,component lithology
#dddddd,1,+,,,siltstone,
#dddddd,1,+++,,,greywacke,
#dddddd,2,x,,,anhydrite,
#dddddd,2,xxx,,,gypsum,
#dddddd,3,/,,,missing,
#dddddd,4,..,,,sandstone,
#dddddd,5,o,,,conglomerate,
#dddddd,5,0,,,till,
#dddddd,6,---,,,mudstone,
#dddddd,7,,,,limestone,
"""
Legend.from_csv(text=hatchy).plot()


Bugs

Decor plots with axes

These should plot as square patches, not rectangles. The text actually flows off the right-hand edge of the plot.


In [38]:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(3, 10))
for i, d in enumerate(l):
    ax = fig.add_subplot(len(l), 1, i+1)
    ax = d.plot(ax=ax)



©2015 Agile Geoscience. Licensed CC-BY. striplog.py