@@ -809,7 +809,11 @@ def _smooth_polygon_edges_between_intersections(
809809
810810
811811def get_fields_assemblages_and_bounds (
812- filename , phase_name_replacements , smoothing_window , smoothing_order
812+ filename ,
813+ phase_name_replacements ,
814+ smoothing_window ,
815+ smoothing_order ,
816+ mask_polygon = None ,
813817):
814818 """
815819 Extract phase assemblage fields and plot bounds from a mode tab file.
@@ -823,6 +827,9 @@ def get_fields_assemblages_and_bounds(
823827 :type smoothing_window: int
824828 :param smoothing_order: Polynomial order for smoothing polygon edges.
825829 :type smoothing_order: int
830+ :param mask_polygon: 2D array of points (P in Pa, T in K),
831+ defining a polygon to mask out.
832+ :type mask_polygon: 2D numpy array
826833 :return: Tuple containing list of polygon data dicts and bounds
827834 [[P_min, P_max], [T_min, T_max]].
828835 :rtype: (list[dict], list[list[float]])
@@ -832,8 +839,21 @@ def get_fields_assemblages_and_bounds(
832839 P , T = data [:2 ]
833840 pressures = P [:, 0 ]
834841 temperatures = T [0 ]
835-
836842 phase_modes = data [2 :]
843+
844+ if mask_polygon is not None :
845+
846+ mask_polygon_bar = mask_polygon .copy ()
847+ mask_polygon_bar [:, 0 ] = mask_polygon_bar [:, 0 ] / 1.0e5
848+
849+ poly = Polygon (mask_polygon_bar )
850+ points = np .vstack ((P .ravel (), T .ravel ())).T
851+ mask = np .array (
852+ [poly .contains (Point (pt )) or poly .touches (Point (pt )) for pt in points ]
853+ )
854+ mask = mask .reshape (P .shape )
855+ phase_modes [:, mask ] = 0.0
856+
837857 num_phases = phase_modes .shape [0 ]
838858 phase_names = [phase_name_replacements .get (name , name ) for name in column_names [2 :]]
839859
@@ -1067,6 +1087,7 @@ def pretty_plot_phase_diagram(
10671087 label_scaling = 3.0 ,
10681088 label_clearance = 0.01 ,
10691089 number_small_fields = True ,
1090+ mask_polygon = None ,
10701091):
10711092 """
10721093 Plot the Perple_X calculated phase diagram on a matplotlib axis.
@@ -1097,6 +1118,9 @@ def pretty_plot_phase_diagram(
10971118 :param number_small_fields: Replace assemblage labels with numbers if
10981119 there is not enough clearance around the label.
10991120 :type number_small_fields: bool
1121+ :param mask_polygon: 2D array of points (P in Pa, T in K),
1122+ defining a polygon to mask out.
1123+ :type mask_polygon: 2D numpy array
11001124 :return: List of assemblages corresponding to numbered small fields.
11011125 :rtype: [str]
11021126 """
@@ -1110,6 +1134,7 @@ def pretty_plot_phase_diagram(
11101134 phase_name_replacements ,
11111135 smoothing_window ,
11121136 smoothing_order ,
1137+ mask_polygon ,
11131138 )
11141139 polygon_data .extend (polygon_data_i )
11151140 bounds .append (bounds_i )
0 commit comments