A Python Application for Visualizing an Imbricate Thrust System: Palomeque Duplex (SE, Spain)

: This paper introduces a Python application for visualizing an imbricate thrust system. The application uses the traditional geologic information to create an HTML geological map with real topography and a set of geological cross-sections with the essential structural and stratigraphic elements. On the basis of the high geological knowledge gained during the last three decades, the Palomeque sheets affecting the Cenozoic Malaguide succession in the Internal Betic Zone (SE Spain) were selected to show the application. In this area, a Malaguide Cretaceous to Lower Miocene succession is deformed as an imbricate thrust system, with two thrusts forming a duplex, affected later by a set of faults with a main strike-slip kinematic. The modeled elements match well with the design of the stratigraphic intervals and the structures reported in recent scientiﬁc publications. This proves the good performance of this Python application for visualizing the structural and stratigraphic architecture. This kind of application could be a crucial stage for future groundwater


Introduction
Numerical modeling has recently been progressively employed to characterize the geological architecture of structures and sediments. These numerical tools involve a great variety of geospatial and geostatistical techniques, as well as stochastic and deterministic models. The used criteria depend on the input spatial coverage and data typology, and the validation of predictions and capability for calibrating, as well as the purpose of the research. In fact, numerical tools allow measuring the accuracy of the represented parameters and variables interactive in 3D modelling and visualizations [1][2][3][4][5][6]. As a result, interactive visualizations (more accurate and real than classic 2D representations) are performed. Moreover, modern 3D models allow incorporating new data into the designs during the proper generation. Therefore, numerical modelling tools are very interesting in the different aspect of applied geology (civil engineering, mining, and hydrogeology) for decision-making.
For instance, there are Python libraries with different geological interests, including sedimentology structural geology, hydrogeology, and mining. There are Python libraries [17][18][19] and post-listing libraries [20,21]. Several computer tools devoted to different fields of geology also appear in scientific documents [22][23][24][25]. Additionally, some social media channels have also published analytics data and machine learning educational applications on geological aspects [26,27].
It is noteworthy that commercial applications, which are usually more expensive, have technical support for users and are user-friendly environments. Contrarily, opensource applications are free of cost and have high adaptability (extending or modifying the sources), but there is an absence of technical support for users, and they show low reliability in some cases.
Our previous experience with Python libraries for 3D visualization, including geological data handling [28][29][30][31], has been very important to develop new applications for visualizing 3D structural and stratigraphic geological features. These new applications included Jupyter notebooks, describing the methodology, and a Python code operative version, which are downloadable from the GitHub repository (https://github.com/bullejos/ visualizing-an-imbricate-thrust-system accessed on 4 July 2023). The created model can be opened with any web browser (without installing additional software) to view different perspectives, enlarge or focus on a single element or specific area, hide elements, and take snapshots in every moment.
This new research aims the application of Python libraries to construct 3D structural and stratigraphic representations of an imbricate thrust system, using, as an example, the Palomeque Duplex from the Malaguide Complex [32][33][34] in the Mula-Pliego Depression from the Sierra Espuña area [35][36][37][38][39][40] in the Murcia province (SE, Spain: Figure 1). The methodology presented in this article can be exported to other geological systems. For that purpose, is necessary to know the open-source Python language, but it is not necessary to be an expert in the language. The details of our methodology are presented in a notebook hosted in a GitHub repository. This notebook serves a Python beginner as a step-by-step guide through the model creation, so an interested researcher can follow suit and adapt the inputs and mimic the procedures to create their own model. Our method is mainly based on the matplotlib graphical library, which is a very comprehensive and simple graphical Python library. There is no difficulty to install or set up the Python environment in which our methodology works, since most of the libraries or modules used are very common and are usually installed in the standard Python environments. To set up the environment where a geological open-source tool works is usually difficult, sometimes because the tool is not updated using old Python module versions; in other cases, these tools usually require a big amount of data (usually obtained from geological drilling), which is difficult to obtain in remote locations and without a great economic support. The data used to build our model is obtained by a geologist with classical fieldworks (geological mapping, cross-section performing, and measuring of stratigraphic columns) with no machinery. Basic geologist experience is needed to adapt the model to reality. Finally, we highlight that one of the biggest advantages of our method is the output format provided to the model, as an HTML file, which only requires a web browser to open and manipulate it. Geosciences 2023, 13, x FOR PEER REVIEW 3 of 16
The Betic Cordillera belongs to the Alpine chains surrounding the western Mediterranean area from the Gibraltar Arc to the Calabria-Peloritani Arc ( Figure 1C) [42][43][44][45]. All these chains were formed during the Cretaceous to Miocene era, due to continental collisions with subductions between the Iberia-Europe and Africa plates, and a few collisions of intermediate microplates. This led to a comparable geology in all the branches of this orogenic belt, with intense tectonics in the Internal Zones and metamorphism in the lower units [41,42].
The area mainly shows the Mesozoic-Cenozoic cover (with a thin sheet of Paleozoic basement) from the Malaguide Complex [38][39][40]. The entire area is structured in the Mula-Pliego Depression (a synclinorium with minor structural highs, related to fold-thrust) to the north ( Figure 1B), followed, to the south, by the Sierra Espuña s.s. (an antiformal stack) [32][33][34].
The area has a quite continuous sedimentary record and outcrops of good quality from the entire succession, so that a large number of papers have been published in the last three decades [32-40, and references therein]. In particular, the Paleocene to Early Miocene tectono-sedimentary evolution has been the subject of numerous research papers, making this basin a key site for understanding the Cenozoic tectono-stratigraphy of the region [38].
Concretely, the goal of this paper is the modeling for visualizing one of these structural heights: the Palomeque sheets ( Figure 2). These sheets are made of two heights: Palomeque and Calvillo, from S to N. These consist of a Cretaceous to Lower Miocene
The Betic Cordillera belongs to the Alpine chains surrounding the western Mediterranean area from the Gibraltar Arc to the Calabria-Peloritani Arc ( Figure 1C) [42][43][44][45]. All these chains were formed during the Cretaceous to Miocene era, due to continental collisions with subductions between the Iberia-Europe and Africa plates, and a few collisions of intermediate microplates. This led to a comparable geology in all the branches of this orogenic belt, with intense tectonics in the Internal Zones and metamorphism in the lower units [41,42].
The area mainly shows the Mesozoic-Cenozoic cover (with a thin sheet of Paleozoic basement) from the Malaguide Complex [38][39][40]. The entire area is structured in the Mula-Pliego Depression (a synclinorium with minor structural highs, related to fold-thrust) to the north ( Figure 1B), followed, to the south, by the Sierra Espuña s.s. (an antiformal stack) [32][33][34].
The area has a quite continuous sedimentary record and outcrops of good quality from the entire succession, so that a large number of papers have been published in the last three decades ( [32][33][34][35][36][37][38][39][40] and references therein). In particular, the Paleocene to Early Miocene tectono-sedimentary evolution has been the subject of numerous research papers, making this basin a key site for understanding the Cenozoic tectono-stratigraphy of the region [38].
Concretely, the goal of this paper is the modeling for visualizing one of these structural heights: the Palomeque sheets ( Figure 2). These sheets are made of two heights: Palomeque and Calvillo, from S to N. These consist of a Cretaceous to Lower Miocene succession, deformed, in an imbricate thrust system, with two thrusts forming a duplex (Figure 2), related to the Lower Miocene deformation in the area as part of the Malaguide wedge-top basin in the area [32][33][34]. This structure is affected later by three faults, with main strike-slip kinematics ( Figure 2).
The main structural elements are the two thrusts and the three sinistral strike-slip faults (Figure 2), while the stratigraphic succession has been divided into seven homogeneous stratigraphic intervals ( Figure 2

Methodology
Python [46] is one of the most popular open-source programming languages at this moment, and it is applied in a wide variety of environmental subjects, including geology. In this work, we have made use of this high-level language to build geological maps and cross-sections, but, also, some tools apart from Python have been used ( Table 1). The main Python graphic library used to create the geological models is matplotlib lib [47]. This is a comprehensive library used by many Python programmers which has several active forums where it is possible to ask and consult many questions (https://discourse.matplotlib. org/ accessed on 4 July 2023 or https://community.plotly.com/ accessed on 4 July 2023). Jupyter [48] has been used to create a notebook (https://github.com/bullejos/visualizingan-imbricate-thrust-system accessed on 4 July 2023), containing all the Python instructions needed to build the geological maps and cross-sections. This notebook is hosted in the GitHub repository (https://github.com/bullejos/visualizing-an-imbricate-thrust-system accessed on 4 July 2023). Table 1. General tools used, apart from Python.

Google Earth pro
Free software that allows visualization and creation of geospatial data GPSVisualizer Free online utility that can be used to handle geographic data Anaconda Open-source platform that is very useful for beginners to install and handle Python environments Jupyter Web application for creating and sharing computational documents It is recommended to download the notebook and run it locally in your computer. In the notebook hosted in the GitHub repository (https://github.com/bullejos/visualizingan-imbricate-thrust-system accessed on 4 July 2023), the needed data to obtain the model can also be found in the data folder. Also, the resulting HTML and PNG files are hosted in the figures folder, but, to open the HTML files, it is necessary to download them, because they are too big to be opened directly in GitHub. GitHub will not show the content of a file with a size of over 1 MB. In the GitHub repository, a readme file is included with the instructions to handle the notebook. A Markdown file (visualizing a thrust system.md) is also included, which can be read directly in the GitHub repository, along with all the instructions in the notebook. To create the geological models, standard mathematics and data processing Python libraries have been used. Those libraries usually come integrated with any standard Python environment (for example, Anaconda). When a library is not included in your environment, the commands "conda install" or "pip install" can be used to install the library. You can consult the library website to see how to install it. In Table 2, the Python libraries used are reported. Some custom functions have also been defined (Table 3). There are two types of custom functions: (1) those used to create the plot data, and that use plot commands such as "Scatter3d", "Mesh3d", or "Surface". The use of these functions reduces the amount of input lines in the code; (2) those used to deal with geometric objects such as lines, planes, or triangles and help to make some mathematical computations. In the Jupyter notebook, the procedure followed to build the geological model of the Palomeque Duplex is explicitly given, and the methodology given in the notebook can be adapted to other zones or geological structures. The methodology presented here is not automatic; it is not a defined script that allows one to get the model from the geological data without any manipulation. To get a model of another location, the procedures presented here can be mimicked, but these must be adapted to the new data of the new location, and researchers must make their own choices of how the model should be. Python has been used by us to produce other geological models in the recent past, but with a different perspective and different kind of data, as is the case of the Llobregat River Delta (Barcelona, Spain) [28][29][30][31]. To build this model in Barcelona, a very complete database of geological drilling was available. In the Palomeque area, the geological data has been obtained by the geologist by classic geological fieldworks without machinery. Uses the plot function "Scatter3d" to produce the data used to define the figure for the 3D model

Data Compilation and The Topographic 3D Model Performing
The starting point to build the 3D model is the geological map, presented in Figure 2A. In that map, tectonic and stratigraphic contacts are represented, as well as dipping values in several points, and also the location (traces) of the geological cross-sections. A flow diagram ( Figure 3) is presented, synthetizing the methodology for the 3D model's performance. The complete process of how to get the model is completely described in the Jupyter notebook, visualizing a thrust system, hosted in the GitHub repository: https://github.com/bullejos/ visualizing-an-imbricate-thrust-system (accessed on 4 July 2023).
Geosciences 2023, 13, x FOR PEER REVIEW 7 of 16 plane_data Uses the plot function "Scatter3d" to produce the data used to define the figure for the 3D model

Data Compilation and The Topographic 3D Model Performing
The starting point to build the 3D model is the geological map, presented in Figure  2A. In that map, tectonic and stratigraphic contacts are represented, as well as dipping values in several points, and also the location (traces) of the geological cross-sections. A flow diagram ( Figure 3) is presented, synthetizing the methodology for the 3D model's performance. The complete process of how to get the model is completely described in the Jupyter notebook, visualizing a thrust system, hosted in the GitHub repository: https://github.com/bullejos/visualizing-an-imbricate-thrust-system (accessed on 4 July 2023). The first step to build the 3D model of the study area is to define a grid of points covering the area. Google Earth pro [49] has been used to build a box (a rectangle) enclosing the study area. This rectangle is built as a track by Google Earth and exported as a kml file with the corresponding data. The track (kml file) needs to be converted to a cvs file so that it can be manipulated, and the online resource GPSVisualizer [50] is applied to do this task.
Then, a distance is fixed and a grid covering the area is built using Python language. This grid consists of a list of points with UTM_X and UTM_Y coordinates. The Python package Pandas [17] is used to process this kind of data. With Pandas, the grid data is exported to a cvs file, which has two columns: one each for the UTM_X and UTM_Y coordinates of the points in the grid. Moreover, the elevations of those points are also needed. The first step to build the 3D model of the study area is to define a grid of points covering the area. Google Earth pro [49] has been used to build a box (a rectangle) enclosing the study area. This rectangle is built as a track by Google Earth and exported as a kml file with the corresponding data. The track (kml file) needs to be converted to a cvs file so that it can be manipulated, and the online resource GPSVisualizer [50] is applied to do this task.
Then, a distance is fixed and a grid covering the area is built using Python language. This grid consists of a list of points with UTM_X and UTM_Y coordinates. The Python package Pandas [17] is used to process this kind of data. With Pandas, the grid data is exported to a cvs file, which has two columns: one each for the UTM_X and UTM_Y coordinates of the points in the grid. Moreover, the elevations of those points are also needed. To get these elevations, the Copernicus Python package [51] is used together with the Copernicus DEM (Digital Elevation Model) [52] and, in particular, the 30-m EEA-10, GLO-30 instance. At this moment, a file (topography.cvs) with the data of a grid of points (UYM_X, UTM_Y, elevation) covering the study area is produced. Now, to get the topographic model of the area, interpolation is needed. There are some scientific computing packages used to interpolate. The main Python mathematical packages or libraries used here are Numpy [53], Simply [54], and SciPy [18]. At the beginning of the Jupyter notebook, some code lines are included that import the necessary packages to be used (https://github.com/bullejos/visualizing-an-imbricate-thrust-system/blob/ main/visualizing%20a%20thrust%20system.ipynb accessed on 4 July 2023). There are three main interpolation methods included in the packages: linear, cubic, and nearest. After analyzing the three methods, the linear method has been chosen, because it is the one that best suits our expectations. The plot command "Surface" is then used to get a 3D model of the topography of the area.
We have to add the rest of the geological elements (thrusts, strike-slip faults, and stratigraphic contacts) to the topographic model. Again, Google Earth is used to create tracks for the contacts (traces) of these geological elements, and GPSVisualizer is used to turn those tracks into cvs files. Finally, Copernicus is used to complete those files with elevations. The "Scatter3d" plot command with mode = lines is then used to add those elements to the model. The last elements we have to add are the traces of the geological cross-sections (intersections of those planes with the topography). For that purpose, lists of points in the directions of the planes are created. With Copernicus, the elevations of those points have been calculated. Again, the "Scatter3d" plot command has been used to represent the traces of the geological cross-sections. Some mathematical computations are also needed to draw the triangles associated to the thrust contacts. To determine each of those triangles, a point U in the corresponding track (which will be the starter vertex), and the length D of the side of the triangle, are fixed. Then, a second point V in the track at a distance D of U is computed. With those two vertices, a third one W is computed to complete the equilateral triangle. Some mathematical functions are defined to do these computations. To complete the model, we add some texts by specifying the positions where the texts must be placed; also, geological symbols for faults (which are just broken lines) are added. The constructed geological map by Python allows viewing the geological contact with real topography.

Construction of the 2D Geological Cross-Sections with the Essential Geological Elements
fits with the geological data we have in the geological cross-section from Figure 2. The way in which the control points, and, thus, Bezier curves are constructed, and the way the corresponding data is manipulated to get the geological cross-sections can also be found in the notebook. The flow diagram that summarizes the process is given in Figure 4. These geological cross-sections performed by Python are constructed in an exact way; the upper line in each section represents the topography and the positions of the geological contacts, with respect to the topography and other surfaces are mathematically calculated using the custom defined functions (Table 3).

Geological Map of the Palomeque Sheets as an HTML File
The same geological map area presented in Figure 2A was created as an interactive HTML file (3D_Palomeque_map.html) using Python language. Figure 5 shows five screenshots from this 3D HTML model. This map shows the duplex structure and strikeslip lateral faults with the real topography. In the geological map, the seven essential stratigraphic intervals are represented: Cretaceous, Paleocene, Eocene 1 (Ypresian), Eocene 2 (Lutetian), Eocene 3 (Bartonian), Oligocene, and Miocene 1 (Aquitanian). The same vertical vs. horizontal ratio was used to plot the geological map, in order not to alter the geological proportions and dippings. It is necessary to note that only a web browser is needed to open the model and that it allows to view different perspectives, enlarge or focus on a single element or specific area, hide elements, and take snapshots in every moment.  (Table 3).

Geological Map of the Palomeque Sheets as an HTML File
The same geological map area presented in Figure 2A was created as an interactive HTML file (3D_Palomeque_map.html) using Python language. Figure 5 shows five screenshots from this 3D HTML model. This map shows the duplex structure and strike-slip lateral faults with the real topography. In the geological map, the seven essential stratigraphic intervals are represented: Cretaceous, Paleocene, Eocene 1 (Ypresian), Eocene 2 (Lutetian), Eocene 3 (Bartonian), Oligocene, and Miocene 1 (Aquitanian). The same vertical vs. horizontal ratio was used to plot the geological map, in order not to alter the geological proportions and dippings. It is necessary to note that only a web browser is needed to open the model and that it allows to view different perspectives, enlarge or focus on a single element or specific area, hide elements, and take snapshots in every moment. es 2023, 13, x FOR PEER REVIEW 10 of 16

Geological Cross-Sections of the Palomeque Sheets Using Python Language
The same five vertical geological cross-sections (A-A', B-B', C-C', D-D', and E-E') presented in Figure 2B were created using Python language ( Figure 6). These are located oriented NW-SE perpendicular to the duplex structure. In the geological cross-sections, the seven essential stratigraphic intervals are also represented: Cretaceous, Paleocene, Eocene 1 (Ypresian), Eocene 2 (Lutetian), Eocene 3 (Bartonian), Oligocene, and Miocene 1 (Aquitanian). Equally, the same vertical vs. horizontal ratio was used to plot all the geological cross-sections in order not to alter the geological proportions and dips.

Geological Cross-Sections of the Palomeque Sheets Using Python Language
The same five vertical geological cross-sections (A-A', B-B', C-C', D-D', and E-E') presented in Figure 2B were created using Python language ( Figure 6). These are located oriented NW-SE perpendicular to the duplex structure. In the geological cross-sections, the seven essential stratigraphic intervals are also represented: Cretaceous, Paleocene, Eocene 1 (Ypresian), Eocene 2 (Lutetian), Eocene 3 (Bartonian), Oligocene, and Miocene 1 (Aquitanian). Equally, the same vertical vs. horizontal ratio was used to plot all the geological cross-sections in order not to alter the geological proportions and dips. es 2023, 13, x FOR PEER REVIEW 11 of 16

Integration of the 3D of Geological Map and the Geological Cross-Sections
Finally, the geological cross-sections are integrated with the geological map in a 3D figure (Figure 4). The custom functions "plane_3d" and "plane_data" use the matplotlib functions "Mesh3d" and "Scatter3d" to prepare the data that conform the 3D model ( Table  3). The output for this model is the HTML file (3D_Palomeque_map_sections.html) is provided as Supplementary Material. Equally, only a web browser is needed to open the model. This HTML representation allows viewing different perspectives, enlarging or focusing on a single element or specific area, hiding elements by clicking in the lateral legend, and take snapshots in every moment. Figure 7 shows six screenshots from this new 3D HTML model. This figure shows the duplex structure and strike-slip lateral faults with the real topography, but also the underground developing of these structures by means of the representation in five geological vertical cross-sections. In the geological map and cross-sections, the seven essential stratigraphic intervals are represented: Cretaceous, Paleocene, Eocene 1 (Ypresian), Eocene 2 (Lutetian), Eocene 3 (Bartonian), Oligocene, and Miocene 1 (Aquitanian). The same vertical vs. horizontal ratio was used to plot the geological map, in order not to alter the geological proportions and bedding attitude. Each geological cross-section can be turned off separately. Also, the topography or mapped elements in surface can be turned off. Moreover, the structural elements can be hidden separately to the stratigraphic contacts in the geologic map.

Integration of the 3D of Geological Map and the Geological Cross-Sections
Finally, the geological cross-sections are integrated with the geological map in a 3D figure (Figure 4). The custom functions "plane_3d" and "plane_data" use the matplotlib functions "Mesh3d" and "Scatter3d" to prepare the data that conform the 3D model ( Table 3). The output for this model is the HTML file (3D_Palomeque_map_sections.html) is provided as Supplementary Material. Equally, only a web browser is needed to open the model. This HTML representation allows viewing different perspectives, enlarging or focusing on a single element or specific area, hiding elements by clicking in the lateral legend, and take snapshots in every moment. Figure 7 shows six screenshots from this new 3D HTML model. This figure shows the duplex structure and strike-slip lateral faults with the real topography, but also the underground developing of these structures by means of the representation in five geological vertical cross-sections. In the geological map and crosssections, the seven essential stratigraphic intervals are represented: Cretaceous, Paleocene, Eocene 1 (Ypresian), Eocene 2 (Lutetian), Eocene 3 (Bartonian), Oligocene, and Miocene 1 (Aquitanian). The same vertical vs. horizontal ratio was used to plot the geological map, in order not to alter the geological proportions and bedding attitude. Each geological cross-section can be turned off separately. Also, the topography or mapped elements in surface can be turned off. Moreover, the structural elements can be hidden separately to the stratigraphic contacts in the geologic map.

Discussion and Conclusions
The above presented geological map ( Figure 5), cross-sections (Figure 6), and the integration of both (Figure 7) performed by Python fit well with the classical hand-made geological map and cross-sections ( Figure 2). The geological map allows viewing the geological contacts (mechanic and stratigraphic) with real topography. On the other hand, the geological cross-sections constructed by Python are performed in an exact way, since the position of the geological contacts, with respect to the topography and other surfaces, are mathematically obtained in an exact way.
For the final design of the curves in the geological cross-sections (Figure 8), Bezier curves are used. These curves provide a very useful tool in computer graphics design. A Bezier curve is determined by a list of control points, and the complexity of the curve depends on the number of control points that determine it. For example, the Bezier curve determined by two points is a straight line; by three points, it is a quadratic curve (parabolic); for four points, it is a cubic curve, etc. Looking at the curves in Figure 2B that appear

Discussion and Conclusions
The above presented geological map ( Figure 5), cross-sections (Figure 6), and the integration of both (Figure 7) performed by Python fit well with the classical hand-made geological map and cross-sections ( Figure 2). The geological map allows viewing the geological contacts (mechanic and stratigraphic) with real topography. On the other hand, the geological cross-sections constructed by Python are performed in an exact way, since the position of the geological contacts, with respect to the topography and other surfaces, are mathematically obtained in an exact way.
For the final design of the curves in the geological cross-sections (Figure 8), Bezier curves are used. These curves provide a very useful tool in computer graphics design. A Bezier curve is determined by a list of control points, and the complexity of the curve depends on the number of control points that determine it. For example, the Bezier curve determined by two points is a straight line; by three points, it is a quadratic curve (parabolic); for four points, it is a cubic curve, etc. Looking at the curves in Figure 2B that appear in the cross-sections and that represent thrusts or stratigraphic contacts, it can be seen that they can be constructed as Bezier curves.
Using an example to illustrate the situation (Figure 9), it is needed to construct a curve that represents a stratigraphic contact, such as the Paleocene-Eocene 1 (P-E1) from the section E-E', shown in Figure 2B (Figure 9A). It is started with the control points F (marked by the geological map and topography) and G (obtained from the general dipping of beds in the geological map). Both points mark the beginning and the end of the curve ( Figure 9B). The Bezier curve determined by these two control points is a straight line ( Figure 9B). Then, if it is needed to draw an anticline near the origin F and a syncline near the end in G, it is necessary to add a new control point H in the transition anticline-syncline ( Figure 9C). in the cross-sections and that represent thrusts or stratigraphic contacts, it can be seen that they can be constructed as Bezier curves.
Using an example to illustrate the situation (Figure 9), it is needed to construct a curve that represents a stratigraphic contact, such as the Paleocene-Eocene 1 (P-E1) from the section E-E', shown in Figure 2B (Figure 9A). It is started with the control points F (marked by the geological map and topography) and G (obtained from the general dipping of beds in the geological map). Both points mark the beginning and the end of the curve ( Figure  9B). The Bezier curve determined by these two control points is a straight line ( Figure 9B). Then, if it is needed to draw an anticline near the origin F and a syncline near the end in G, it is necessary to add a new control point H in the transition anticline-syncline ( Figure  9C).  In order to draw the anticline, a new control point is necessary and is added: point I. Then, the Bezier curve is determined by F, I, H, and G, being the curve composed by a parabolic segment and a straight one ( Figure 9D). For the construction of the syncline close to the G point, a new control point J should be added ( Figure 9E). Therefore, the Bezier curve determined by the list of control points [F, G, H, I, J] becomes the curve from Figure  9A, and is very similar, or exact, to Figure 2B (section E-E').
When a deformed stratigraphic succession is represented with several stratigraphic units (Cretaceous, Paleocene, Eocene 1, Eocene 2, and Eocene 3: C, P, E1, E2, and E3, respectively) separated by stratigraphic contacts, as in the case of the same section E-E' from Figure 2B (Figure 8), the Bezier curves must represent the folds and must also be parallelized to conserve the thicknesses of the stratigraphic units in the whole section and in all the sections. In this case, it is necessary to follow the above-mentioned methodology, starting with the upper contact represented in the geological cross-section by a Bezier curve, and, later, construct lower and lower curves parallelized to the upper one. All the curves have starting control points located in the intersection with the topography and marked by the geological map, or even points of intersection between contacts (control points J, I, H, G, F). The final design depends on the supplementary control points inserted in order to obtain a more similar shape to the geological cross-section from Figure 2B.
In conclusion, from the above-introduced methodology proposed by us and the scope of the achieved structural models, it can be argued that our methodology implemented using Python libraries (matplotlib, numpy, sympy, etc.) seems to be an ergonomic in the cross-sections and that represent thrusts or stratigraphic contacts, it can be seen that they can be constructed as Bezier curves.
Using an example to illustrate the situation (Figure 9), it is needed to construct a curve that represents a stratigraphic contact, such as the Paleocene-Eocene 1 (P-E1) from the section E-E', shown in Figure 2B (Figure 9A). It is started with the control points F (marked by the geological map and topography) and G (obtained from the general dipping of beds in the geological map). Both points mark the beginning and the end of the curve ( Figure  9B). The Bezier curve determined by these two control points is a straight line ( Figure 9B). Then, if it is needed to draw an anticline near the origin F and a syncline near the end in G, it is necessary to add a new control point H in the transition anticline-syncline ( Figure  9C).  In order to draw the anticline, a new control point is necessary and is added: point I. Then, the Bezier curve is determined by F, I, H, and G, being the curve composed by a parabolic segment and a straight one ( Figure 9D). For the construction of the syncline close to the G point, a new control point J should be added ( Figure 9E). Therefore, the Bezier curve determined by the list of control points [F, G, H, I, J] becomes the curve from Figure  9A, and is very similar, or exact, to Figure 2B (section E-E').
When a deformed stratigraphic succession is represented with several stratigraphic units (Cretaceous, Paleocene, Eocene 1, Eocene 2, and Eocene 3: C, P, E1, E2, and E3, respectively) separated by stratigraphic contacts, as in the case of the same section E-E' from Figure 2B (Figure 8), the Bezier curves must represent the folds and must also be parallelized to conserve the thicknesses of the stratigraphic units in the whole section and in all the sections. In this case, it is necessary to follow the above-mentioned methodology, starting with the upper contact represented in the geological cross-section by a Bezier curve, and, later, construct lower and lower curves parallelized to the upper one. All the curves have starting control points located in the intersection with the topography and marked by the geological map, or even points of intersection between contacts (control points J, I, H, G, F). The final design depends on the supplementary control points inserted in order to obtain a more similar shape to the geological cross-section from Figure 2B.
In conclusion, from the above-introduced methodology proposed by us and the scope of the achieved structural models, it can be argued that our methodology implemented using Python libraries (matplotlib, numpy, sympy, etc.) seems to be an ergonomic In order to draw the anticline, a new control point is necessary and is added: point I. Then, the Bezier curve is determined by F, I, H, and G, being the curve composed by a parabolic segment and a straight one ( Figure 9D). For the construction of the syncline close to the G point, a new control point J should be added ( Figure 9E). Therefore, the Bezier curve determined by the list of control points [F, G, H, I, J] becomes the curve from Figure 9A, and is very similar, or exact, to Figure 2B (section E-E').
When a deformed stratigraphic succession is represented with several stratigraphic units (Cretaceous, Paleocene, Eocene 1, Eocene 2, and Eocene 3: C, P, E1, E2, and E3, respectively) separated by stratigraphic contacts, as in the case of the same section E-E' from Figure 2B (Figure 8), the Bezier curves must represent the folds and must also be parallelized to conserve the thicknesses of the stratigraphic units in the whole section and in all the sections. In this case, it is necessary to follow the above-mentioned methodology, starting with the upper contact represented in the geological cross-section by a Bezier curve, and, later, construct lower and lower curves parallelized to the upper one. All the curves have starting control points located in the intersection with the topography and marked by the geological map, or even points of intersection between contacts (control points J, I, H, G, F). The final design depends on the supplementary control points inserted in order to obtain a more similar shape to the geological cross-section from Figure 2B.
In conclusion, from the above-introduced methodology proposed by us and the scope of the achieved structural models, it can be argued that our methodology implemented using Python libraries (matplotlib, numpy, sympy, etc.) seems to be an ergonomic and easy-access tool for visualizing the 3D and 2D structural and stratigraphic architecture of a deformed sector, as is the case of the imbricate thrust system from the Palomeque duplex. The 3D models can be viewed in a web browser, so they are easily accessible to every user. The interactive 3D HTML models of essential geologic elements (structural and stratigraphic) allow making quantitative measures, which is quite valuable to support many geological disciplines, such as the applied hydrogeological, geotechnical, and mining research interests. This methodology can be exported to other geological areas and structures. It is not necessary to be an expert in the Python language. The created methodology is presented in a notebook hosted in a GitHub repository (https://github.com/bullejos/visualizing-an-imbricate-thrust-system accessed on 4 July 2023), so that an interested researcher can follow suit, adapting the inputs and mimicking the procedures to create their own model. Our method is mainly based on the matpoltlib graphical library, which is a very comprehensive and simple graphical Python library. There is no difficulty to install or set up the Python environment in which our mythology works, since most of the libraries or modules used are very common and usually come installed in the standard Python environments. Our methodology has the advantage of not requiring a big amount of data obtained by machinery and not requiring a great economic support. The data used to build our model is obtained by a geologist with classical fieldworks (geological mapping, cross-sections, and measuring of stratigraphic columns). Basic geologist experience is required to adapt the model to reality.
What has been said about the construction of structural models demonstrates the good performance of Python programming language, and shows how packages are a user-friendly software platform for visualizing 3D geological models. For instance, Python application may assist with crucial concerns for structural geology with applications in large civil works and mining, as well as groundwater resources. Currently, additional research on program routines aimed at assessing mapping uncertainty is ongoing. This paper contributes to the field of structural geological tools, which represents poorly documented information in the geology scientific literature.

Data Availability Statement:
The data presented in this study are available on request from the corresponding author.