def get_chempot_range_map_plot(self, elements, referenced=True):
        """
        Returns a plot of the chemical potential range _map. Currently works
        only for 3-component PDs.

        Args:
            elements: Sequence of elements to be considered as independent
                variables. E.g., if you want to show the stability ranges of
                all Li-Co-O phases wrt to uLi and uO, you will supply
                [Element("Li"), Element("O")]
            referenced: if True, gives the results with a reference being the
                        energy of the elemental phase. If False, gives absolute values.

        Returns:
            A matplotlib plot object.
        """

        plt = pretty_plot(12, 8)
        chempot_ranges = self._pd.get_chempot_range_map(
            elements, referenced=referenced)
        missing_lines = {}
        excluded_region = []
        for entry, lines in chempot_ranges.items():
            comp = entry.composition
            center_x = 0
            center_y = 0
            coords = []
            contain_zero = any([comp.get_atomic_fraction(el) == 0
                                for el in elements])
            is_boundary = (not contain_zero) and \
                          sum([comp.get_atomic_fraction(el) for el in
                               elements]) == 1
            for line in lines:
                (x, y) = line.coords.transpose()
                plt.plot(x, y, "k-")

                for coord in line.coords:
                    if not in_coord_list(coords, coord):
                        coords.append(coord.tolist())
                        center_x += coord[0]
                        center_y += coord[1]
                if is_boundary:
                    excluded_region.extend(line.coords)

            if coords and contain_zero:
                missing_lines[entry] = coords
            else:
                xy = (center_x / len(coords), center_y / len(coords))
                plt.annotate(latexify(entry.name), xy, fontsize=22)

        ax = plt.gca()
        xlim = ax.get_xlim()
        ylim = ax.get_ylim()

        # Shade the forbidden chemical potential regions.
        excluded_region.append([xlim[1], ylim[1]])
        excluded_region = sorted(excluded_region, key=lambda c: c[0])
        (x, y) = np.transpose(excluded_region)
        plt.fill(x, y, "0.80")

        # The hull does not generate the missing horizontal and vertical lines.
        # The following code fixes this.
        el0 = elements[0]
        el1 = elements[1]
        for entry, coords in missing_lines.items():
            center_x = sum([c[0] for c in coords])
            center_y = sum([c[1] for c in coords])
            comp = entry.composition
            is_x = comp.get_atomic_fraction(el0) < 0.01
            is_y = comp.get_atomic_fraction(el1) < 0.01
            n = len(coords)
            if not (is_x and is_y):
                if is_x:
                    coords = sorted(coords, key=lambda c: c[1])
                    for i in [0, -1]:
                        x = [min(xlim), coords[i][0]]
                        y = [coords[i][1], coords[i][1]]
                        plt.plot(x, y, "k")
                        center_x += min(xlim)
                        center_y += coords[i][1]
                elif is_y:
                    coords = sorted(coords, key=lambda c: c[0])
                    for i in [0, -1]:
                        x = [coords[i][0], coords[i][0]]
                        y = [coords[i][1], min(ylim)]
                        plt.plot(x, y, "k")
                        center_x += coords[i][0]
                        center_y += min(ylim)
                xy = (center_x / (n + 2), center_y / (n + 2))
            else:
                center_x = sum(coord[0] for coord in coords) + xlim[0]
                center_y = sum(coord[1] for coord in coords) + ylim[0]
                xy = (center_x / (n + 1), center_y / (n + 1))

            plt.annotate(latexify(entry.name), xy,
                         horizontalalignment="center",
                         verticalalignment="center", fontsize=22)

        plt.xlabel("$\\mu_{{{0}}} - \\mu_{{{0}}}^0$ (eV)"
                   .format(el0.symbol))
        plt.ylabel("$\\mu_{{{0}}} - \\mu_{{{0}}}^0$ (eV)"
                   .format(el1.symbol))
        plt.tight_layout()
        return plt
def get_chempot_range_map_plot ( self , elements , referenced = True ) : plt = pretty_plot ( 12 , 8 ) chempot_ranges = self . _pd . get_chempot_range_map ( elements , referenced = referenced ) missing_lines = { } excluded_region = [ ] for entry , lines in chempot_ranges . items ( ) : comp = entry . composition center_x = 0 center_y = 0 coords = [ ] contain_zero = any ( [ comp . get_atomic_fraction ( el ) == 0 for el in elements ] ) is_boundary = ( not contain_zero ) and sum ( [ comp . get_atomic_fraction ( el ) for el in elements ] ) == 1 for line in lines : ( x , y ) = line . coords . transpose ( ) plt . plot ( x , y , "k-" ) for coord in line . coords : if not in_coord_list ( coords , coord ) : coords . append ( coord . tolist ( ) ) center_x += coord [ 0 ] center_y += coord [ 1 ] if is_boundary : excluded_region . extend ( line . coords ) if coords and contain_zero : missing_lines [ entry ] = coords else : xy = ( center_x / len ( coords ) , center_y / len ( coords ) ) plt . annotate ( latexify ( entry . name ) , xy , fontsize = 22 ) ax = plt . gca ( ) xlim = ax . get_xlim ( ) ylim = ax . get_ylim ( ) excluded_region . append ( [ xlim [ 1 ] , ylim [ 1 ] ] ) excluded_region = sorted ( excluded_region , key = lambda c : c [ 0 ] ) ( x , y ) = np . transpose ( excluded_region ) plt . fill ( x , y , "0.80" ) el0 = elements [ 0 ] el1 = elements [ 1 ] for entry , coords in missing_lines . items ( ) : center_x = sum ( [ c [ 0 ] for c in coords ] ) center_y = sum ( [ c [ 1 ] for c in coords ] ) comp = entry . composition is_x = comp . get_atomic_fraction ( el0 ) < 0.01 is_y = comp . get_atomic_fraction ( el1 ) < 0.01 n = len ( coords ) if not ( is_x and is_y ) : if is_x : coords = sorted ( coords , key = lambda c : c [ 1 ] ) for i in [ 0 , - 1 ] : x = [ min ( xlim ) , coords [ i ] [ 0 ] ] y = [ coords [ i ] [ 1 ] , coords [ i ] [ 1 ] ] plt . plot ( x , y , "k" ) center_x += min ( xlim ) center_y += coords [ i ] [ 1 ] elif is_y : coords = sorted ( coords , key = lambda c : c [ 0 ] ) for i in [ 0 , - 1 ] : x = [ coords [ i ] [ 0 ] , coords [ i ] [ 0 ] ] y = [ coords [ i ] [ 1 ] , min ( ylim ) ] plt . plot ( x , y , "k" ) center_x += coords [ i ] [ 0 ] center_y += min ( ylim ) xy = ( center_x / ( n + 2 ) , center_y / ( n + 2 ) ) else : center_x = sum ( coord [ 0 ] for coord in coords ) + xlim [ 0 ] center_y = sum ( coord [ 1 ] for coord in coords ) + ylim [ 0 ] xy = ( center_x / ( n + 1 ) , center_y / ( n + 1 ) ) plt . annotate ( latexify ( entry . name ) , xy , horizontalalignment = "center" , verticalalignment = "center" , fontsize = 22 ) plt . xlabel ( "$\\mu_{{{0}}} - \\mu_{{{0}}}^0$ (eV)" . format ( el0 . symbol ) ) plt . ylabel ( "$\\mu_{{{0}}} - \\mu_{{{0}}}^0$ (eV)" . format ( el1 . symbol ) ) plt . tight_layout ( ) return plt
Returns a plot of the chemical potential range _map. Currently works
        only for 3-component PDs.

        Args:
            elements: Sequence of elements to be considered as independent
                variables. E.g., if you want to show the stability ranges of
                all Li-Co-O phases wrt to uLi and uO, you will supply
                [Element("Li"), Element("O")]
            referenced: if True, gives the results with a reference being the
                        energy of the elemental phase. If False, gives absolute values.

        Returns:
            A matplotlib plot object.