Join the official 2019 Python Developers Survey

Stereonets for matplotlib

## Project description

mplstereonet provides lower-hemisphere equal-area and equal-angle stereonets for matplotlib. ## What’s New

Major changes in mplstereonet-v0.5 are:

• ax.cone method to plot small circles
• Various functions to fit poles and planes to a distribution of observations (e.g. mplstereonet.fit_girdle, mplstereonet.fit_pole, and mplstereonet.eigenvectors)
• Mean vector calculation and Fisher statistics for the mean vector (mplstereonet.find_mean_vector and mplstereonet.find_fisher_stats) (Many thanks to Tobias Schönberg!)

## Basic Usage

In most cases, you’ll want to import mplstereonet and then make an axes with projection="stereonet" (By default, this is an equal-area stereonet). Alternately, you can use mplstereonet.subplots, which functions identically to matplotlib.pyplot.subplots, but creates stereonet axes.

As an example:

```import matplotlib.pyplot as plt
import mplstereonet

fig = plt.figure()

strike, dip = 315, 30
ax.plane(strike, dip, 'g-', linewidth=2)
ax.pole(strike, dip, 'g^', markersize=18)
ax.rake(strike, dip, -25)
ax.grid()

plt.show()
``` Planes, lines, poles, and rakes can be plotted using axes methods (e.g. ax.line(plunge, bearing) or ax.rake(strike, dip, rake_angle)).

All planar measurements are expected to follow the right-hand-rule to indicate dip direction. As an example, 315/30S would be 135/30 follwing the right-hand rule.

## Density Contouring

mplstereonet also provides a few different methods of producing contoured orientation density diagrams.

The ax.density_contour and ax.density_contourf axes methods provide density contour lines and filled density contours, respectively. “Raw” density grids can be produced with the mplstereonet.density_grid function.

As a basic example:

```import matplotlib.pyplot as plt
import numpy as np
import mplstereonet

fig, ax = mplstereonet.subplots()

strike, dip = 90, 80
num = 10
strikes = strike + 10 * np.random.randn(num)
dips = dip + 10 * np.random.randn(num)

cax = ax.density_contourf(strikes, dips, measurement='poles')

ax.pole(strikes, dips)
ax.grid(True)
fig.colorbar(cax)

plt.show()
``` By default, a modified Kamb method with exponential smoothing [Vollmer1995] is used to estimate the orientation density distribution. Other methods (such as the “traditional” Kamb [Kamb1956] and “Schmidt” (a.k.a. 1%) methods) are available as well. The method and expected count (in standard deviations) can be controlled by the method and sigma keyword arguments, respectively. ## Utilities

mplstereonet also includes a number of utilities to parse structural measurements in either quadrant or azimuth form such that they follow the right-hand-rule.

For an example, see parsing_example.py:

```Parse quadrant azimuth measurements
"N30E" --> 30.0
"E30N" --> 60.0
"W10S" --> 260.0
"N 10 W" --> 350.0

Note that the output follows the right-hand-rule.
"215/10" --> Strike: 215.0, Dip: 10.0
"215/10E" --> Strike: 35.0, Dip: 10.0
"215/10NW" --> Strike: 215.0, Dip: 10.0
"N30E/45NW" --> Strike: 210.0, Dip: 45.0
"E10N   20 N" --> Strike: 260.0, Dip: 20.0
"W30N/46.7 S" --> Strike: 120.0, Dip: 46.7

Similarly, you can parse rake measurements that don't follow the RHR.
"N30E/45NW 10NE" --> Strike: 210.0, Dip: 45.0, Rake: 170.0
"210 45 30N" --> Strike: 210.0, Dip: 45.0, Rake: 150.0
"N30E/45NW raking 10SW" --> Strike: 210.0, Dip: 45.0, Rake: 10.0
```

Additionally, you can find plane intersections and make other calculations by combining utility functions. See plane_intersection.py and parse_anglier_data.py for examples.

## Project details

This version 0.5 0.4.0 0.3 0.2 0.1