24 Plotting Hypocenters of Earthquakes with PyVista#

Hypocenters of earthquake can be nicely visualized using GemGIS and PyVista.

7534154e8643491085e9e2728fdb9183

Set File Paths and download Tutorial Data#

If you downloaded the latest GemGIS version from the Github repository, append the path so that the package can be imported successfully. Otherwise, it is recommended to install GemGIS via pip install gemgis and import GemGIS using import gemgis as gg. In addition, the file path to the folder where the data is being stored is set. The tutorial data is downloaded using Pooch (https://www.fatiando.org/pooch/latest/index.html) and stored in the specified folder. Use pip install pooch if Pooch is not installed on your system yet.

[1]:
import gemgis as gg

file_path ='data/24_plotting_hypocenters_of_earthquakes/'
WARNING (theano.configdefaults): g++ not available, if using conda: `conda install m2w64-toolchain`
C:\Users\ale93371\Anaconda3\envs\test_gempy\lib\site-packages\theano\configdefaults.py:560: UserWarning: DeprecationWarning: there is no c++ compiler.This is deprecated and with Theano 0.11 a c++ compiler will be mandatory
  warnings.warn("DeprecationWarning: there is no c++ compiler."
WARNING (theano.configdefaults): g++ not detected ! Theano will be unable to execute optimized C-implementations (for both CPU and GPU) and will default to Python implementations. Performance will be severely degraded. To remove this warning, set Theano flags cxx to an empty string.
WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.
[2]:
gg.download_gemgis_data.download_tutorial_data(filename="24_plotting_hypocenters_of_earthquakes.zip", dirpath=file_path)

Load Earthquake Data#

The data used here was obtained from the earthquake catalog of the Earthquake Station of the University of Cologne in Bensberg (http://www.seismo.uni-koeln.de/catalog/index.htm)

import gemgis as gg import pandas as pd data = pd.read_csv(file_path + 'earthquakes_aachen.csv', delimiter=';').dropna() data.head(15)data = data[data['Magnitude'] != '-'] data = data[data['Tiefe [km]'] != '-'] data.head(10)data['Magnitude'] = pd.to_numeric(data['Magnitude']) data['Tiefe [km]'] = pd.to_numeric(data['Tiefe [km]']) data['Date'] = pd.to_datetime(data['Date']) data['Year'] = pd.DatetimeIndex(data['Date']).year data['X'] = pd.to_numeric(data['X']) data['Y'] = pd.to_numeric(data['Y']) data['Z'] = pd.to_numeric(data['Z'])

Converting Pandas DataFrame to GeoDataFrame and reproject coordinates#

[3]:
import geopandas as gpd
gdf = gpd.read_file(filename= file_path+'earthquake_data.shp')
[4]:
#gdf = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data.X, data.Y), crs='EPSG:4326').to_crs('EPSG:4647').reset_index()

gdf = gg.vector.extract_xy(gdf=gdf, reset_index=True)
gdf.head()
[4]:
Y X Z RASTERVALU Tiefe [km] Magnitude Epizentrum Year geometry
0 5645741.63 32322660.15 -8249.25 150.75 8.40 1.50 STETTERNICH 2002 POINT (32322660.151 5645741.630)
1 5645947.18 32323159.51 89.63 89.63 0.00 0.80 SOPHIENHOEHE 2014 POINT (32323159.505 5645947.183)
2 5637979.08 32306261.57 -14056.14 143.86 14.20 2.20 ALSDORF 2007 POINT (32306261.571 5637979.080)
3 5645345.19 32321239.77 -8124.22 275.78 8.40 1.70 STETTERNICH 1999 POINT (32321239.770 5645345.189)
4 5645698.15 32320689.25 -5329.58 270.42 5.60 1.90 STETTERNICH 1999 POINT (32320689.249 5645698.148)
gdf.drop('Date', axis=1).to_file(file_path + 'earthquake_data.shp')

Loading WMS Data for Plotting#

[5]:
wms = gg.web.load_wms(url='https://ows.terrestris.de/osm/service?')
[6]:
wms_map = gg.web.load_as_array(url=wms.url,
                               layer='OSM-WMS',
                               style='default',
                               crs='EPSG:4647',
                               bbox=[32286000,32328000, 5620000,5648000],
                               size=[4200, 2800],
                               filetype='image/png')

Plotting the data#

[7]:
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1,1, figsize=(20,20))

ax.imshow(wms_map, extent=[32286000,32328000, 5620000,5648000])
gdf.plot(ax=ax, aspect='equal', column='Magnitude', cmap='Reds', markersize = gdf['Tiefe [km]'].values*10)
[7]:
<AxesSubplot:>
../../_images/getting_started_tutorial_24_plotting_hypocenters_of_earthquakes_16_1.png

Create PyVista Spheres#

[8]:
import pyvista as pv

test = pv.Sphere(radius=1000, center=gdf.loc[0][['X', 'Y', 'Z']].tolist())
test
[8]:
HeaderData Arrays
PolyDataInformation
N Cells1680
N Points842
X Bounds3.232e+07, 3.232e+07
Y Bounds5.645e+06, 5.647e+06
Z Bounds-9.249e+03, -7.249e+03
N Arrays1
NameFieldTypeN CompMinMax
NormalsPointsfloat323-1.000e+001.000e+00
[9]:
import numpy as np

spheres = pv.MultiBlock([pv.Sphere(radius=gdf.loc[i]['Magnitude']*200, center=gdf.loc[i][['X', 'Y', 'Z']].tolist()) for i in range(len(gdf))])

for i in range(len(spheres.keys())):
    spheres[spheres.keys()[i]]['Magnitude'] = np.zeros(len(spheres[spheres.keys()[i]].points)) + gdf.loc[i]['Magnitude']
    spheres[spheres.keys()[i]]['Year'] = np.zeros(len(spheres[spheres.keys()[i]].points)) + gdf.loc[i]['Year']
[10]:
type(spheres)
[10]:
pyvista.core.composite.MultiBlock
[11]:
sargs = dict(fmt="%.1f", color='black')

p = pv.Plotter(notebook=True)

p.add_mesh(spheres,scalars='Magnitude', cmap='Reds', clim=[0,6], scalar_bar_args=sargs)

p.set_background('white')
p.show_grid(color='black')
p.show()
../../_images/getting_started_tutorial_24_plotting_hypocenters_of_earthquakes_21_0.png

The above shown steps are also combined in the function create_meshes_hypocenters(..).

[12]:
spheres = gg.visualization.create_meshes_hypocenters(gdf=gdf)
spheres
[12]:
InformationBlocks
MultiBlockValues
N Blocks497
X Bounds32287780.000, 32328260.000
Y Bounds5620074.000, 5648385.000
Z Bounds-24317.020, 309.130
IndexNameType
0Block-00PolyData
1Block-01PolyData
2Block-02PolyData
3Block-03PolyData
4Block-04PolyData
5Block-05PolyData
6Block-06PolyData
7Block-07PolyData
8Block-08PolyData
9Block-09PolyData
10Block-10PolyData
11Block-11PolyData
12Block-12PolyData
13Block-13PolyData
14Block-14PolyData
15Block-15PolyData
16Block-16PolyData
17Block-17PolyData
18Block-18PolyData
19Block-19PolyData
20Block-20PolyData
21Block-21PolyData
22Block-22PolyData
23Block-23PolyData
24Block-24PolyData
25Block-25PolyData
26Block-26PolyData
27Block-27PolyData
28Block-28PolyData
29Block-29PolyData
30Block-30PolyData
31Block-31PolyData
32Block-32PolyData
33Block-33PolyData
34Block-34PolyData
35Block-35PolyData
36Block-36PolyData
37Block-37PolyData
38Block-38PolyData
39Block-39PolyData
40Block-40PolyData
41Block-41PolyData
42Block-42PolyData
43Block-43PolyData
44Block-44PolyData
45Block-45PolyData
46Block-46PolyData
47Block-47PolyData
48Block-48PolyData
49Block-49PolyData
50Block-50PolyData
51Block-51PolyData
52Block-52PolyData
53Block-53PolyData
54Block-54PolyData
55Block-55PolyData
56Block-56PolyData
57Block-57PolyData
58Block-58PolyData
59Block-59PolyData
60Block-60PolyData
61Block-61PolyData
62Block-62PolyData
63Block-63PolyData
64Block-64PolyData
65Block-65PolyData
66Block-66PolyData
67Block-67PolyData
68Block-68PolyData
69Block-69PolyData
70Block-70PolyData
71Block-71PolyData
72Block-72PolyData
73Block-73PolyData
74Block-74PolyData
75Block-75PolyData
76Block-76PolyData
77Block-77PolyData
78Block-78PolyData
79Block-79PolyData
80Block-80PolyData
81Block-81PolyData
82Block-82PolyData
83Block-83PolyData
84Block-84PolyData
85Block-85PolyData
86Block-86PolyData
87Block-87PolyData
88Block-88PolyData
89Block-89PolyData
90Block-90PolyData
91Block-91PolyData
92Block-92PolyData
93Block-93PolyData
94Block-94PolyData
95Block-95PolyData
96Block-96PolyData
97Block-97PolyData
98Block-98PolyData
99Block-99PolyData
100Block-100PolyData
101Block-101PolyData
102Block-102PolyData
103Block-103PolyData
104Block-104PolyData
105Block-105PolyData
106Block-106PolyData
107Block-107PolyData
108Block-108PolyData
109Block-109PolyData
110Block-110PolyData
111Block-111PolyData
112Block-112PolyData
113Block-113PolyData
114Block-114PolyData
115Block-115PolyData
116Block-116PolyData
117Block-117PolyData
118Block-118PolyData
119Block-119PolyData
120Block-120PolyData
121Block-121PolyData
122Block-122PolyData
123Block-123PolyData
124Block-124PolyData
125Block-125PolyData
126Block-126PolyData
127Block-127PolyData
128Block-128PolyData
129Block-129PolyData
130Block-130PolyData
131Block-131PolyData
132Block-132PolyData
133Block-133PolyData
134Block-134PolyData
135Block-135PolyData
136Block-136PolyData
137Block-137PolyData
138Block-138PolyData
139Block-139PolyData
140Block-140PolyData
141Block-141PolyData
142Block-142PolyData
143Block-143PolyData
144Block-144PolyData
145Block-145PolyData
146Block-146PolyData
147Block-147PolyData
148Block-148PolyData
149Block-149PolyData
150Block-150PolyData
151Block-151PolyData
152Block-152PolyData
153Block-153PolyData
154Block-154PolyData
155Block-155PolyData
156Block-156PolyData
157Block-157PolyData
158Block-158PolyData
159Block-159PolyData
160Block-160PolyData
161Block-161PolyData
162Block-162PolyData
163Block-163PolyData
164Block-164PolyData
165Block-165PolyData
166Block-166PolyData
167Block-167PolyData
168Block-168PolyData
169Block-169PolyData
170Block-170PolyData
171Block-171PolyData
172Block-172PolyData
173Block-173PolyData
174Block-174PolyData
175Block-175PolyData
176Block-176PolyData
177Block-177PolyData
178Block-178PolyData
179Block-179PolyData
180Block-180PolyData
181Block-181PolyData
182Block-182PolyData
183Block-183PolyData
184Block-184PolyData
185Block-185PolyData
186Block-186PolyData
187Block-187PolyData
188Block-188PolyData
189Block-189PolyData
190Block-190PolyData
191Block-191PolyData
192Block-192PolyData
193Block-193PolyData
194Block-194PolyData
195Block-195PolyData
196Block-196PolyData
197Block-197PolyData
198Block-198PolyData
199Block-199PolyData
200Block-200PolyData
201Block-201PolyData
202Block-202PolyData
203Block-203PolyData
204Block-204PolyData
205Block-205PolyData
206Block-206PolyData
207Block-207PolyData
208Block-208PolyData
209Block-209PolyData
210Block-210PolyData
211Block-211PolyData
212Block-212PolyData
213Block-213PolyData
214Block-214PolyData
215Block-215PolyData
216Block-216PolyData
217Block-217PolyData
218Block-218PolyData
219Block-219PolyData
220Block-220PolyData
221Block-221PolyData
222Block-222PolyData
223Block-223PolyData
224Block-224PolyData
225Block-225PolyData
226Block-226PolyData
227Block-227PolyData
228Block-228PolyData
229Block-229PolyData
230Block-230PolyData
231Block-231PolyData
232Block-232PolyData
233Block-233PolyData
234Block-234PolyData
235Block-235PolyData
236Block-236PolyData
237Block-237PolyData
238Block-238PolyData
239Block-239PolyData
240Block-240PolyData
241Block-241PolyData
242Block-242PolyData
243Block-243PolyData
244Block-244PolyData
245Block-245PolyData
246Block-246PolyData
247Block-247PolyData
248Block-248PolyData
249Block-249PolyData
250Block-250PolyData
251Block-251PolyData
252Block-252PolyData
253Block-253PolyData
254Block-254PolyData
255Block-255PolyData
256Block-256PolyData
257Block-257PolyData
258Block-258PolyData
259Block-259PolyData
260Block-260PolyData
261Block-261PolyData
262Block-262PolyData
263Block-263PolyData
264Block-264PolyData
265Block-265PolyData
266Block-266PolyData
267Block-267PolyData
268Block-268PolyData
269Block-269PolyData
270Block-270PolyData
271Block-271PolyData
272Block-272PolyData
273Block-273PolyData
274Block-274PolyData
275Block-275PolyData
276Block-276PolyData
277Block-277PolyData
278Block-278PolyData
279Block-279PolyData
280Block-280PolyData
281Block-281PolyData
282Block-282PolyData
283Block-283PolyData
284Block-284PolyData
285Block-285PolyData
286Block-286PolyData
287Block-287PolyData
288Block-288PolyData
289Block-289PolyData
290Block-290PolyData
291Block-291PolyData
292Block-292PolyData
293Block-293PolyData
294Block-294PolyData
295Block-295PolyData
296Block-296PolyData
297Block-297PolyData
298Block-298PolyData
299Block-299PolyData
300Block-300PolyData
301Block-301PolyData
302Block-302PolyData
303Block-303PolyData
304Block-304PolyData
305Block-305PolyData
306Block-306PolyData
307Block-307PolyData
308Block-308PolyData
309Block-309PolyData
310Block-310PolyData
311Block-311PolyData
312Block-312PolyData
313Block-313PolyData
314Block-314PolyData
315Block-315PolyData
316Block-316PolyData
317Block-317PolyData
318Block-318PolyData
319Block-319PolyData
320Block-320PolyData
321Block-321PolyData
322Block-322PolyData
323Block-323PolyData
324Block-324PolyData
325Block-325PolyData
326Block-326PolyData
327Block-327PolyData
328Block-328PolyData
329Block-329PolyData
330Block-330PolyData
331Block-331PolyData
332Block-332PolyData
333Block-333PolyData
334Block-334PolyData
335Block-335PolyData
336Block-336PolyData
337Block-337PolyData
338Block-338PolyData
339Block-339PolyData
340Block-340PolyData
341Block-341PolyData
342Block-342PolyData
343Block-343PolyData
344Block-344PolyData
345Block-345PolyData
346Block-346PolyData
347Block-347PolyData
348Block-348PolyData
349Block-349PolyData
350Block-350PolyData
351Block-351PolyData
352Block-352PolyData
353Block-353PolyData
354Block-354PolyData
355Block-355PolyData
356Block-356PolyData
357Block-357PolyData
358Block-358PolyData
359Block-359PolyData
360Block-360PolyData
361Block-361PolyData
362Block-362PolyData
363Block-363PolyData
364Block-364PolyData
365Block-365PolyData
366Block-366PolyData
367Block-367PolyData
368Block-368PolyData
369Block-369PolyData
370Block-370PolyData
371Block-371PolyData
372Block-372PolyData
373Block-373PolyData
374Block-374PolyData
375Block-375PolyData
376Block-376PolyData
377Block-377PolyData
378Block-378PolyData
379Block-379PolyData
380Block-380PolyData
381Block-381PolyData
382Block-382PolyData
383Block-383PolyData
384Block-384PolyData
385Block-385PolyData
386Block-386PolyData
387Block-387PolyData
388Block-388PolyData
389Block-389PolyData
390Block-390PolyData
391Block-391PolyData
392Block-392PolyData
393Block-393PolyData
394Block-394PolyData
395Block-395PolyData
396Block-396PolyData
397Block-397PolyData
398Block-398PolyData
399Block-399PolyData
400Block-400PolyData
401Block-401PolyData
402Block-402PolyData
403Block-403PolyData
404Block-404PolyData
405Block-405PolyData
406Block-406PolyData
407Block-407PolyData
408Block-408PolyData
409Block-409PolyData
410Block-410PolyData
411Block-411PolyData
412Block-412PolyData
413Block-413PolyData
414Block-414PolyData
415Block-415PolyData
416Block-416PolyData
417Block-417PolyData
418Block-418PolyData
419Block-419PolyData
420Block-420PolyData
421Block-421PolyData
422Block-422PolyData
423Block-423PolyData
424Block-424PolyData
425Block-425PolyData
426Block-426PolyData
427Block-427PolyData
428Block-428PolyData
429Block-429PolyData
430Block-430PolyData
431Block-431PolyData
432Block-432PolyData
433Block-433PolyData
434Block-434PolyData
435Block-435PolyData
436Block-436PolyData
437Block-437PolyData
438Block-438PolyData
439Block-439PolyData
440Block-440PolyData
441Block-441PolyData
442Block-442PolyData
443Block-443PolyData
444Block-444PolyData
445Block-445PolyData
446Block-446PolyData
447Block-447PolyData
448Block-448PolyData
449Block-449PolyData
450Block-450PolyData
451Block-451PolyData
452Block-452PolyData
453Block-453PolyData
454Block-454PolyData
455Block-455PolyData
456Block-456PolyData
457Block-457PolyData
458Block-458PolyData
459Block-459PolyData
460Block-460PolyData
461Block-461PolyData
462Block-462PolyData
463Block-463PolyData
464Block-464PolyData
465Block-465PolyData
466Block-466PolyData
467Block-467PolyData
468Block-468PolyData
469Block-469PolyData
470Block-470PolyData
471Block-471PolyData
472Block-472PolyData
473Block-473PolyData
474Block-474PolyData
475Block-475PolyData
476Block-476PolyData
477Block-477PolyData
478Block-478PolyData
479Block-479PolyData
480Block-480PolyData
481Block-481PolyData
482Block-482PolyData
483Block-483PolyData
484Block-484PolyData
485Block-485PolyData
486Block-486PolyData
487Block-487PolyData
488Block-488PolyData
489Block-489PolyData
490Block-490PolyData
491Block-491PolyData
492Block-492PolyData
493Block-493PolyData
494Block-494PolyData
495Block-495PolyData
496Block-496PolyData
[13]:
sargs = dict(fmt="%.1f", color='black')

p = pv.Plotter(notebook=True)

p.add_mesh(spheres,scalars='Magnitude', cmap='Reds', clim=[0,6], scalar_bar_args=sargs)

p.set_background('white')
p.show_grid(color='black')
p.show()
../../_images/getting_started_tutorial_24_plotting_hypocenters_of_earthquakes_24_0.png