def get_plotter(self): """ Return an instance of |PhononBandsPlotter| that can be use to plot multiple phonon bands or animate the bands """ plotter = PhononBandsPlotter() for iv, phbands in enumerate(self.phbands_qpath_vol): label = "V=%.2f $A^3$ " % phbands.structure.volume plotter.add_phbands(label, phbands) return plotter
def plot_phbs(self, phbands, temperatures=None, t_max=1000, colormap="plasma", **kwargs): """ Given a list of |PhononBands| plots the band structures with a color depending on the temperature using a |PhononBandsPlotter|. If temperatures are not given they will be deduced inverting the dependence of volume with respect to the temperature. If a unique volume could not be identified an error will be raised. Args: phbands: list of |PhononBands| objects. temperatures: list of temperatures. t_max: maximum temperature considered for plotting. colormap: matplotlib color map. Returns: |matplotlib-Figure| """ if temperatures is None: tv = self.get_t_for_vols([b.structure.volume for b in phbands], t_max=t_max) temperatures = [] for b, t in zip(phbands, tv): if len(t) != 1: raise ValueError( "Couldn't find a single temperature for structure with " "volume {}. Found {}: {}".format( b.structure.volume, len(t), list(t))) temperatures.append(t[0]) temperatures_str = ["{:.0f} K".format(t) for t in temperatures] import matplotlib.pyplot as plt cmap = plt.get_cmap(colormap) colors = [cmap(t / max(temperatures)) for t in temperatures] labels_phbs = zip(temperatures_str, phbands) pbp = PhononBandsPlotter(labels_phbs) pbp._LINE_COLORS = colors pbp._LINE_STYLES = ['-'] fig = pbp.combiplot(show=False, **kwargs) return fig
def OnComparePhbands(self, event): """Plot multiple phonon bands""" dialog = ewx.BandsCompareDialog(self, self.phbands_filepaths) if dialog.ShowModal() == wx.ID_CANCEL: return try: selected = dialog.GetSelectedIndices() except: awx.showErrorMessage(self) plotter = PhononBandsPlotter() # for path, phbands in zip(self.phbands_filepaths, self.phbands_list): # label = os.path.relpath(path) # plotter.add_phbands(label, phbands) for i in selected: label = os.path.relpath(self.phbands_filepaths[i]) plotter.add_phbands(label, self.phbands_list[i]) try: print(plotter.bands_statdiff()) except: pass plotter.plot()
def plot_phbs(self, phbands, temperatures=None, t_max=1000, colormap="plasma", **kwargs): """ Given a list of |PhononBands| plots the band structures with a color depending on the temperature using a |PhononBandsPlotter|. If temperatures are not given they will be deduced inverting the dependence of volume with respect to the temperature. If a unique volume could not be identified an error will be raised. Args: phbands: list of |PhononBands| objects. temperatures: list of temperatures. t_max: maximum temperature considered for plotting. colormap: matplotlib color map. Returns: |matplotlib-Figure| """ if temperatures is None: tv = self.get_t_for_vols([b.structure.volume for b in phbands], t_max=t_max) temperatures = [] for b, t in zip(phbands, tv): if len(t) != 1: raise ValueError("Couldn't find a single temperature for structure with " "volume {}. Found {}: {}".format(b.structure.volume, len(t), list(t))) temperatures.append(t[0]) temperatures_str = ["{:.0f} K".format(t) for t in temperatures] import matplotlib.pyplot as plt cmap = plt.get_cmap(colormap) colors = [cmap(t / max(temperatures)) for t in temperatures] labels_phbs = zip(temperatures_str, phbands) pbp = PhononBandsPlotter(labels_phbs) pbp._LINE_COLORS = colors pbp._LINE_STYLES = ['-'] fig = pbp.combiplot(show=False, **kwargs) return fig
def test_phbands_plotter(self): """Testing phbands plotter.""" phbst_paths = 2 * [abidata.ref_file("trf2_5.out_PHBST.nc")] phdos_paths = 2 * [abidata.ref_file("trf2_5.out_PHDOS.nc")] plotter = PhononBandsPlotter() plotter.add_phbands("AlAs", phbst_paths[0], phdos=phdos_paths[0]) plotter.add_phbands("Same-AlAs", phbst_paths[1], phdos=phdos_paths[1]) repr(plotter); str(plotter) assert len(plotter.phbands_list) == 2 assert len(plotter.phdoses_list) == 2 assert plotter.has_same_formula() # __add__ merges two plotters: p2 = plotter.add_plotter(plotter) assert len(p2.phbands_list) == 2 assert len(p2.phdoses_list) == 2 df = dataframe_from_phbands(plotter.phbands_list) assert "nqpt" in df df = plotter.get_phbands_frame() assert df is not None if self.has_matplotlib(): assert plotter.combiplot(units="eV", show=True) assert plotter.gridplot(units="meV", show=True) assert plotter.boxplot(units="cm-1", show=True) assert plotter.combiboxplot(units="Thz", show=True) assert plotter.animate(show=False) if self.has_nbformat(): plotter.write_notebook(nbpath=self.get_tmpname(text=True)) if self.has_ipywidgets(): assert plotter.ipw_select_plot() is not None # Plotter without PHDOS plotter = PhononBandsPlotter(key_phbands=[("foo", phbst_paths[0]), ("bar", phbst_paths[1])]) if self.has_matplotlib(): assert plotter.combiplot(units="EV", show=True) assert plotter.gridplot(units="MEV", show=True) assert plotter.boxplot(units="cm^-1", mode_range=[0, 3], swarm=True, show=True) assert plotter.combiboxplot(units="THZ", mode_range=[0, 3], show=True)
def test_phbands_plotter(self): """Testing phbands plotter.""" phbst_paths = 2 * [abidata.ref_file("trf2_5.out_PHBST.nc")] phdos_paths = 2 * [abidata.ref_file("trf2_5.out_PHDOS.nc")] plotter = PhononBandsPlotter() plotter.add_phbands("AlAs", phbst_paths[0], phdos=phdos_paths[0]) plotter.add_phbands("Same-AlAs", phbst_paths[1], phdos=phdos_paths[1]) repr(plotter) str(plotter) assert len(plotter.phbands_list) == 2 assert len(plotter.phdoses_list) == 2 assert plotter.has_same_formula() # __add__ merges two plotters: p2 = plotter.add_plotter(plotter) assert len(p2.phbands_list) == 2 assert len(p2.phdoses_list) == 2 df = dataframe_from_phbands(plotter.phbands_list) assert "nqpt" in df df = plotter.get_phbands_frame() assert df is not None if self.has_matplotlib(): assert plotter.combiplot(units="eV", show=True) assert plotter.gridplot(units="meV", show=True) assert plotter.boxplot(units="cm-1", show=True) assert plotter.combiboxplot(units="Thz", show=True) assert plotter.animate(show=False) if self.has_nbformat(): plotter.write_notebook(nbpath=self.get_tmpname(text=True)) if self.has_ipywidgets(): assert plotter.ipw_select_plot() is not None # Plotter without PHDOS plotter = PhononBandsPlotter( key_phbands=[("foo", phbst_paths[0]), ("bar", phbst_paths[1])]) if self.has_matplotlib(): assert plotter.combiplot(units="EV", show=True) assert plotter.gridplot(units="MEV", show=True) assert plotter.boxplot(units="cm^-1", mode_range=[0, 3], swarm=True, show=True) assert plotter.combiboxplot(units="THZ", mode_range=[0, 3], show=True)