def ternplot(dbf, comps, phases, conds, x=None, y=None, eq_kwargs=None, **plot_kwargs): """ Calculate the ternary isothermal, isobaric phase diagram. This function is a convenience wrapper around equilibrium() and eqplot(). Parameters ---------- dbf : Database Thermodynamic database containing the relevant parameters. comps : list Names of components to consider in the calculation. phases : list Names of phases to consider in the calculation. conds : dict Maps StateVariables to values and/or iterables of values. For ternplot only one changing composition and one potential coordinate each is supported. x : Composition instance of a pycalphad.variables.composition to plot on the x-axis. Must correspond to an independent condition. y : Composition instance of a pycalphad.variables.composition to plot on the y-axis. Must correspond to an independent condition. eq_kwargs : optional Keyword arguments to equilibrium(). plot_kwargs : optional Keyword arguments to eqplot(). Returns ------- A phase diagram as a figure. Examples -------- None yet. """ eq_kwargs = eq_kwargs if eq_kwargs is not None else dict() indep_comps = [ key for key, value in conds.items() if isinstance(key, v.Composition) and len(np.atleast_1d(value)) > 1 ] indep_pots = [ key for key, value in conds.items() if ((key == v.T) or (key == v.P)) and len(np.atleast_1d(value)) > 1 ] if (len(indep_comps) != 2) or (len(indep_pots) != 0): raise ValueError( 'ternplot() requires exactly two composition coordinates') full_eq = equilibrium(dbf, comps, phases, conds, **eq_kwargs) # TODO: handle x and y as strings with #87 x = x if x in indep_comps else indep_comps[0] y = y if y in indep_comps else indep_comps[1] return eqplot(full_eq, x=x, y=y, **plot_kwargs)
def multiplot(dbf, comps, phases, conds, datasets, eq_kwargs=None, plot_kwargs=None, data_kwargs=None): """ Plot a phase diagram with datapoints described by datasets. This is a wrapper around pycalphad.equilibrium, pycalphad's eqplot, and dataplot. Parameters ---------- dbf : Database pycalphad thermodynamic database containing the relevant parameters. comps : list Names of components to consider in the calculation. phases : list Names of phases to consider in the calculation. conds : dict Maps StateVariables to values and/or iterables of values. datasets : PickleableTinyDB Database of phase equilibria datasets eq_kwargs : dict Keyword arguments passed to pycalphad equilibrium() plot_kwargs : dict Keyword arguments passed to pycalphad eqplot() data_kwargs : dict Keyword arguments passed to dataplot() Returns ------- A phase diagram with phase equilibria data as a figure Examples -------- >>> from pycalphad import Database, variables as v # doctest: +SKIP >>> from pycalphad.plot.eqplot import eqplot # doctest: +SKIP >>> from espei.datasets import load_datasets, recursive_glob # doctest: +SKIP >>> datasets = load_datasets(recursive_glob('.', '*.json')) # doctest: +SKIP >>> dbf = Database('my_databases.tdb') # doctest: +SKIP >>> my_phases = list(dbf.phases.keys()) # doctest: +SKIP >>> multiplot(dbf, ['CU', 'MG', 'VA'], my_phases, {v.P: 101325, v.T: 1000, v.X('MG'): (0, 1, 0.01)}, datasets) # doctest: +SKIP """ deprecation_msg = ( "`espei.plot.multiplot` is deprecated and will be removed in ESPEI 0.9. " "Users depending on `multiplot` should use pycalphad's `binplot` or `ternplot` " "followed by `espei.plot.dataplot`. Note that pycalphad's mapping can offer " "signficant reductions in calculation time compared to using `multiplot`. See " "ESPEI's recipes for an example: " "https://espei.org/en/latest/recipes.html#plot-phase-diagram-with-data" ) warnings.warn(deprecation_msg, category=FutureWarning) eq_kwargs = eq_kwargs or dict() plot_kwargs = plot_kwargs or dict() data_kwargs = data_kwargs or dict() eq_result = equilibrium(dbf, comps, phases, conds, **eq_kwargs) ax = eqplot(eq_result, **plot_kwargs) ax = eqdataplot(eq_result, datasets, ax=ax, plot_kwargs=data_kwargs) return ax
def multiplot(dbf, comps, phases, conds, datasets, eq_kwargs=None, plot_kwargs=None, data_kwargs=None): """ Plot a phase diagram with datapoints described by datasets. This is a wrapper around pycalphad.equilibrium, pycalphad's eqplot, and dataplot. Parameters ---------- dbf : Database pycalphad thermodynamic database containing the relevant parameters. comps : list Names of components to consider in the calculation. phases : list Names of phases to consider in the calculation. conds : dict Maps StateVariables to values and/or iterables of values. datasets : PickleableTinyDB Database of phase equilibria datasets eq_kwargs : dict Keyword arguments passed to pycalphad equilibrium() plot_kwargs : dict Keyword arguments passed to pycalphad eqplot() data_kwargs : dict Keyword arguments passed to dataplot() Returns ------- A phase diagram with phase equilibria data as a figure Examples -------- >>> from pycalphad import Database, variables as v >>> from pycalphad.plot.eqplot import eqplot >>> from espei.datasets import load_datasets, recursive_glob >>> datasets = load_datasets(recursive_glob('.', '*.json')) >>> dbf = Database('my_databases.tdb') >>> my_phases = list(dbf.phases.keys()) >>> multiplot(dbf, ['CU', 'MG', 'VA'], my_phases, {v.P: 101325, v.T: 1000, v.X('MG'): (0, 1, 0.01)}, datasets) """ eq_kwargs = eq_kwargs or dict() plot_kwargs = plot_kwargs or dict() data_kwargs = data_kwargs or dict() eq_result = equilibrium(dbf, comps, phases, conds, **eq_kwargs) ax = eqplot(eq_result, **plot_kwargs) ax = eqdataplot(eq_result, datasets, ax=ax, plot_kwargs=data_kwargs) return ax
def binplot(dbf, comps, phases, conds, eq_kwargs=None, **plot_kwargs): """ Calculate the binary isobaric phase diagram. This function is a convenience wrapper around equilibrium() and eqplot(). Parameters ---------- dbf : Database Thermodynamic database containing the relevant parameters. comps : list Names of components to consider in the calculation. phases : list Names of phases to consider in the calculation. conds : dict Maps StateVariables to values and/or iterables of values. For binplot only one changing composition and one potential coordinate each is supported. eq_kwargs : optional Keyword arguments to equilibrium(). plot_kwargs : optional Keyword arguments to eqplot(). Returns ------- A phase diagram as a figure. Examples -------- None yet. """ eq_kwargs = eq_kwargs if eq_kwargs is not None else dict() indep_comp = [ key for key, value in conds.items() if isinstance(key, v.Composition) and len(np.atleast_1d(value)) > 1 ] indep_pot = [ key for key, value in conds.items() if ((key == v.T) or (key == v.P)) and len(np.atleast_1d(value)) > 1 ] if (len(indep_comp) != 1) or (len(indep_pot) != 1): raise ValueError( 'binplot() requires exactly one composition and one potential coordinate' ) indep_comp = indep_comp[0] indep_pot = indep_pot[0] full_eq = equilibrium(dbf, comps, phases, conds, **eq_kwargs) return eqplot(full_eq, x=indep_comp, y=indep_pot, **plot_kwargs)
def ternplot(dbf, comps, phases, conds, x=None, y=None, eq_kwargs=None, **plot_kwargs): """ Calculate the ternary isothermal, isobaric phase diagram. This function is a convenience wrapper around equilibrium() and eqplot(). Parameters ---------- dbf : Database Thermodynamic database containing the relevant parameters. comps : list Names of components to consider in the calculation. phases : list Names of phases to consider in the calculation. conds : dict Maps StateVariables to values and/or iterables of values. For ternplot only one changing composition and one potential coordinate each is supported. x : Composition instance of a pycalphad.variables.composition to plot on the x-axis. Must correspond to an independent condition. y : Composition instance of a pycalphad.variables.composition to plot on the y-axis. Must correspond to an independent condition. eq_kwargs : optional Keyword arguments to equilibrium(). plot_kwargs : optional Keyword arguments to eqplot(). Returns ------- A phase diagram as a figure. Examples -------- None yet. """ eq_kwargs = eq_kwargs if eq_kwargs is not None else dict() indep_comps = [key for key, value in conds.items() if isinstance(key, v.Composition) and len(np.atleast_1d(value)) > 1] indep_pots = [key for key, value in conds.items() if ((key == v.T) or (key == v.P)) and len(np.atleast_1d(value)) > 1] if (len(indep_comps) != 2) or (len(indep_pots) != 0): raise ValueError('ternplot() requires exactly two composition coordinates') full_eq = equilibrium(dbf, comps, phases, conds, **eq_kwargs) # TODO: handle x and y as strings with #87 x = x if x in indep_comps else indep_comps[0] y = y if y in indep_comps else indep_comps[1] return eqplot(full_eq, x=x, y=y, **plot_kwargs)
def binplot(dbf, comps, phases, conds, eq_kwargs=None, **plot_kwargs): """ Calculate the binary isobaric phase diagram. This function is a convenience wrapper around equilibrium() and eqplot(). Parameters ---------- dbf : Database Thermodynamic database containing the relevant parameters. comps : list Names of components to consider in the calculation. phases : list Names of phases to consider in the calculation. conds : dict Maps StateVariables to values and/or iterables of values. For binplot only one changing composition and one potential coordinate each is supported. eq_kwargs : optional Keyword arguments to equilibrium(). plot_kwargs : optional Keyword arguments to eqplot(). Returns ------- A phase diagram as a figure. Examples -------- None yet. """ eq_kwargs = eq_kwargs if eq_kwargs is not None else dict() # TODO: Temporarily disable refinement until we improve the algorithm eq_kwargs['_approx'] = True indep_comp = [key for key, value in conds.items() if isinstance(key, v.Composition) and len(np.atleast_1d(value)) > 1] indep_pot = [key for key, value in conds.items() if ((key == v.T) or (key == v.P)) and len(np.atleast_1d(value)) > 1] if (len(indep_comp) != 1) or (len(indep_pot) != 1): raise ValueError('binplot() requires exactly one composition and one potential coordinate') indep_comp = indep_comp[0] indep_pot = indep_pot[0] full_eq = equilibrium(dbf, comps, phases, conds, **eq_kwargs) return eqplot(full_eq, x=indep_comp, y=indep_pot, **plot_kwargs)