Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wrap meca #516

Merged
merged 77 commits into from
Aug 3, 2020
Merged
Show file tree
Hide file tree
Changes from 76 commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
e26ecd3
Initial commit to add meca for focal mechanism plotting
tjnewton Jul 11, 2020
0232450
Formatted and checked initial commit of add-meca
tjnewton Jul 11, 2020
922af45
Merge branch 'master' into add-meca
tjnewton Jul 11, 2020
28efc2d
Add meca to index.rst
liamtoney Jul 12, 2020
2fe87af
Added all GMT meca data conventions to pygmt meca
tjnewton Jul 12, 2020
cff30cc
Remove trailing whitespace
liamtoney Jul 12, 2020
b6339a1
Remove extra parens
liamtoney Jul 12, 2020
1239366
Remove convention warnings
liamtoney Jul 12, 2020
ffff36d
Use GMTError
liamtoney Jul 12, 2020
d9407e9
Import GMTError
liamtoney Jul 12, 2020
8536864
Merge branch 'master' into add-meca
liamtoney Jul 12, 2020
ed383d0
Remove comment
liamtoney Jul 12, 2020
f9ac410
Minor comment edits
liamtoney Jul 12, 2020
5f3bfae
Fix typo
liamtoney Jul 12, 2020
910e0f3
Line length reductions
liamtoney Jul 12, 2020
29c0738
Add alias autofill to docstring
liamtoney Jul 12, 2020
ae84de1
Docstring formatting
liamtoney Jul 12, 2020
78cde02
Remove example
liamtoney Jul 12, 2020
598efb6
Adjust line length in docstring
liamtoney Jul 12, 2020
cfef2d5
More line length stuff
liamtoney Jul 12, 2020
31a0973
Better convention string formatting
liamtoney Jul 12, 2020
100d4f1
Simplify docstring
liamtoney Jul 12, 2020
52cd24f
Implemented scale, updated doc string.
tjnewton Jul 12, 2020
97697aa
implemented plotting different moment tensor components and offset
tjnewton Jul 12, 2020
cfd1c21
More docstring edits
liamtoney Jul 12, 2020
da20e4f
Add full moment tensor test
liamtoney Jul 12, 2020
6dfcbe6
Format with black; add os
liamtoney Jul 12, 2020
de80acc
Add fmt baseline image for test
liamtoney Jul 12, 2020
acc6bf6
Rename test function
liamtoney Jul 12, 2020
8040b34
created meca example
tjnewton Jul 12, 2020
5352f9c
formatted meca example
tjnewton Jul 12, 2020
5782ee8
Update examples/gallery/plot/meca.py to style guidelines
tjnewton Jul 12, 2020
393d1c8
Update examples/gallery/plot/meca.py
tjnewton Jul 12, 2020
f57ff25
better doc string in meca example
tjnewton Jul 12, 2020
4314417
maybe fixed whitespace in meca.py?
tjnewton Jul 12, 2020
1d89c6f
Add function for testing the component argument for mt convention
liamtoney Jul 13, 2020
cd3ebca
Change location of C flag logic
liamtoney Jul 13, 2020
45b01de
Add text, which currently fails
liamtoney Jul 13, 2020
deaa1aa
Merge branch 'master' into add-meca
liamtoney Jul 13, 2020
ff164e6
Disable text kwarg for meca for now
liamtoney Jul 13, 2020
64fa78c
added ability to read in dicts of lists as spec
tjnewton Jul 19, 2020
641dd02
added pandas dataframe functionality
tjnewton Jul 19, 2020
a44e36a
deleted fancy MT tests
tjnewton Jul 19, 2020
d666290
update test_meca_spec_dictionary doc string
tjnewton Jul 19, 2020
916269b
added test for dict of lists
tjnewton Jul 19, 2020
9a5c390
added test for dataframe
tjnewton Jul 19, 2020
9d0cb4a
pushing the test files would help
tjnewton Jul 19, 2020
790864a
added test for 1d array and moment tensor convention
tjnewton Jul 21, 2020
b7a85bd
added 2d array test
tjnewton Jul 21, 2020
770e6b6
change variable format to data_format for style checks
tjnewton Jul 21, 2020
f94c04e
fixed isinstance calls for style
tjnewton Jul 21, 2020
ed83d01
camel casing test names
tjnewton Jul 21, 2020
5ea36ce
make format, make check
tjnewton Jul 21, 2020
c35bbbc
added test for file input
tjnewton Jul 21, 2020
355379d
fix PARAMS storage to dict and fix random bugs
tjnewton Jul 21, 2020
dbd936f
fixed naming convention and loop bug
tjnewton Jul 21, 2020
8defa26
make format & make check :)
tjnewton Jul 21, 2020
80af68a
docstring formatting
tjnewton Jul 24, 2020
eb3ce79
moar docstring formatting
tjnewton Jul 24, 2020
69f3919
rename param dict
tjnewton Jul 24, 2020
0b8fdfe
didn't pull webpage commits first
tjnewton Jul 24, 2020
6545cb1
an offering to the pylint gods
tjnewton Jul 24, 2020
e48c945
pylint dislikes capitalized constants in methods, hence now lowercase
tjnewton Jul 24, 2020
6b83b16
silence refactor-related pylint warnings
tjnewton Jul 24, 2020
2cad4a7
pylint: disable=too-many-statements
tjnewton Jul 24, 2020
7548740
changed lat and lon variables to latitude and longitude
tjnewton Jul 27, 2020
b5ab932
updated syntax in meca exam example
tjnewton Jul 27, 2020
f44bc5d
clarification that plot_longitude and plot_latitude are no longer req…
tjnewton Jul 27, 2020
3946493
added 1d array as input for latitude, longitude, depth, plot_longitud…
tjnewton Jul 27, 2020
08830e9
test for event location as arrays and lists
tjnewton Jul 27, 2020
a4c65ac
Merge branch 'master' into add-meca
tjnewton Jul 31, 2020
50f582c
changed test_meca_spec_dictionary to contain one focal mechanism
tjnewton Aug 3, 2020
b173b49
deleted focal_mechanisms.txt and changed test_meca to only use temp file
tjnewton Aug 3, 2020
b388ab2
more descriptive variable name in test_meca_spec_file
tjnewton Aug 3, 2020
bf47d8b
one more rename for good measure
tjnewton Aug 3, 2020
6c3af68
fix bug in test_meca_spec_file
tjnewton Aug 3, 2020
53424e9
pass object instead of file name string
tjnewton Aug 3, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/api/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ Plotting data and laying out the map:
Figure.image
Figure.shift_origin
Figure.text
Figure.meca

Color palette table generation:

Expand Down
33 changes: 33 additions & 0 deletions examples/gallery/plot/meca.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""
Focal mechanisms
----------------

The :meth:`pygmt.Figure.meca` method can plot focal mechanisms, or beachballs.
We can specify the focal mechanism nodal planes or moment tensor components as
a dict using the ``spec`` argument (or they can be specified as a 1d or 2d array,
or within a specified file). The size of plotted beachballs can be specified
using the ``scale`` argument.
"""

import pygmt

fig = pygmt.Figure()

# generate a basemap near Washington state showing coastlines, land, and water
fig.coast(
region=[-125, -122, 47, 49],
projection="M6c",
land="grey",
water="lightblue",
shorelines=True,
resolution="f",
frame="a",
)

# store focal mechanisms parameters in a dict
focal_mechanism = dict(strike=330, dip=30, rake=90, magnitude=3)

# pass the focal mechanism data to meca in addition to the scale and event location
fig.meca(focal_mechanism, scale="1c", longitude=-124.3, latitude=48.1, depth=12.0)

fig.show()
383 changes: 382 additions & 1 deletion pygmt/base_plotting.py

Large diffs are not rendered by default.

Binary file added pygmt/tests/baseline/test_meca_loc_array.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pygmt/tests/baseline/test_meca_spec_1d_array.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pygmt/tests/baseline/test_meca_spec_2d_array.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pygmt/tests/baseline/test_meca_spec_dataframe.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pygmt/tests/baseline/test_meca_spec_file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
239 changes: 239 additions & 0 deletions pygmt/tests/test_meca.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
"""
Tests for meca
"""
import os
import pandas as pd
import numpy as np
import pytest
from pygmt.helpers import GMTTempFile

from .. import Figure


TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data")


@pytest.mark.mpl_image_compare
def test_meca_spec_dictionary():
"""
Test supplying a dictionary containing a single focal mechanism to the
`spec` argument.
"""

fig = Figure()

# Right lateral strike slip focal mechanism
fig.meca(
dict(strike=0, dip=90, rake=0, magnitude=5),
longitude=0,
latitude=5,
depth=0,
scale="2.5c",
region=[-1, 1, 4, 6],
projection="M14c",
frame=2,
)

return fig


@pytest.mark.mpl_image_compare
def test_meca_spec_dict_list():
"""
Test supplying a dictionary containing a list of focal mechanism to the
`spec` argument.
"""

fig = Figure()

# supply focal mechanisms as a dict of lists
focal_mechanisms = dict(
strike=[330, 350], dip=[30, 50], rake=[90, 90], magnitude=[3, 2]
)

fig.meca(
focal_mechanisms,
longitude=[-124.3, -124.4],
latitude=[48.1, 48.2],
depth=[12.0, 11.0],
region=[-125, -122, 47, 49],
scale="2c",
projection="M14c",
)

return fig


@pytest.mark.mpl_image_compare
def test_meca_spec_dataframe():
"""
Test supplying a pandas DataFrame containing focal mechanisms and
locations to the `spec` argument.
"""

fig = Figure()

# supply focal mechanisms to meca as a dataframe
focal_mechanisms = dict(
strike=[324, 353],
dip=[20.6, 40],
rake=[83, 90],
magnitude=[3.4, 2.9],
longitude=[-124, -124.4],
latitude=[48.1, 48.2],
depth=[12, 11.0],
)
spec_dataframe = pd.DataFrame(data=focal_mechanisms)

fig.meca(spec_dataframe, region=[-125, -122, 47, 49], scale="2c", projection="M14c")

return fig


@pytest.mark.mpl_image_compare
def test_meca_spec_1d_array():
"""
Test supplying a 1D numpy array containing focal mechanisms and
locations to the `spec` argument.
"""

fig = Figure()

# supply focal mechanisms to meca as a 1D numpy array, here we are using
# the Harvard CMT zero trace convention but the focal mechanism
# parameters may be specified any of the available conventions. Since we
# are not using a dict or dataframe the convention and component should
# be specified.
focal_mechanism = [
-127.40, # longitude
40.87, # latitude
12, # depth
-3.19, # mrr
0.16, # mtt
3.03, # mff
-1.02, # mrt
-3.93, # mrf
-0.02, # mtf
23, # exponent
0, # plot_lon, 0 to plot at event location
0, # plot_lat, 0 to plot at event location
]
focal_mech_array = np.asarray(focal_mechanism)

fig.meca(
focal_mech_array,
convention="mt",
component="full",
region=[-128, -127, 40, 41],
scale="2c",
projection="M14c",
)

return fig


@pytest.mark.mpl_image_compare
def test_meca_spec_2d_array():
"""
Test supplying a 2D numpy array containing focal mechanisms and
locations to the `spec` argument.
"""

fig = Figure()

# supply focal mechanisms to meca as a 2D numpy array, here we are using
# the GCMT convention but the focal mechanism parameters may be
# specified any of the available conventions. Since we are not using a
# dict or dataframe the convention and component should be specified.
focal_mechanisms = [
[
-127.40, # longitude
40.87, # latitude
12, # depth
170, # strike1
20, # dip1
-110, # rake1
11, # strike2
71, # dip2
-83, # rake2
5.1, # mantissa
23, # exponent
0, # plot_lon, 0 means we want to plot at the event location
0, # plot_lat
],
[-127.50, 40.88, 12.0, 168, 40, -115, 20, 54, -70, 4.0, 23, 0, 0],
]
focal_mechs_array = np.asarray(focal_mechanisms)

fig.meca(
focal_mechs_array,
convention="gcmt",
region=[-128, -127, 40, 41],
scale="2c",
projection="M14c",
)

return fig


@pytest.mark.mpl_image_compare
def test_meca_spec_file():
"""
Test supplying a file containing focal mechanisms and locations to the
`spec` argument.
"""

fig = Figure()

focal_mechanism = [-127.43, 40.81, 12, -3.19, 1.16, 3.93, -1.02, -3.93, -1.02, 23]

# writes temp file to pass to gmt
with GMTTempFile():
with open("temp.name", mode="w") as temp_file:
temp_file.write(" ".join([str(x) for x in focal_mechanism]))
# supply focal mechanisms to meca as a file
fig.meca(
"temp.name",
convention="mt",
component="full",
region=[-128, -127, 40, 41],
scale="2c",
projection="M14c",
)

return fig


@pytest.mark.mpl_image_compare
def test_meca_loc_array():
"""
Test supplying lists and np.ndarrays as the event location (longitude,
latitude, and depth).
"""

fig = Figure()

# specify focal mechanisms
focal_mechanisms = dict(
strike=[327, 350], dip=[41, 50], rake=[68, 90], magnitude=[3, 2]
)

# longitude, latitude, and depth may be specified as an int, float,
# list, or 1d numpy array
longitude = np.array([-123.3, -124.4])
latitude = np.array([48.4, 48.2])
depth = [12.0, 11.0] # to test mixed data types as inputs

scale = "2c"

fig.meca(
focal_mechanisms,
scale,
longitude,
latitude,
depth,
region=[-125, -122, 47, 49],
projection="M14c",
)

return fig