def intensity_1d(self, intensity, ms=20., lw=2., fs=20., title=r'$|\psi^{(j)}|^2$'): ''' Plot intensity for 1D lattices. :param intensity: np.array. Field intensity. :param ms: Positive Float. Default value 20. Markersize. :param lw: Positive Float. Default value 2. Linewith, connect sublattice sites. :param fs: Positive Float. Default value 20. Font size. :param title: String. Default value 'Intensity'. Figure title. ''' error_handling.ndarray(intensity, 'intensity', self.sys.lat.sites) error_handling.empty_ndarray(self.sys.lat.coor, 'sys.get_lattice') error_handling.positive_real(ms, 'ms') error_handling.positive_real(lw, 'lw') error_handling.positive_real(fs, 'fs') error_handling.string(title, 'title') fig, ax = plt.subplots() ax.set_xlabel('$j$', fontsize=fs) ax.set_ylabel(title, fontsize=fs) ax.set_title(title, fontsize=fs) for t, c in zip(self.sys.lat.tags, self.colors): plt.plot(self.sys.lat.coor['x'][self.sys.lat.coor['tag'] == t], intensity[self.sys.lat.coor['tag'] == t], '-o', color=c, ms=ms, lw=lw) plt.xlim([-1., self.sys.lat.sites]) plt.ylim([0., np.max(intensity)+.05]) fig.set_tight_layout(True) plt.draw() return fig
def dir_name(self, dir_name): ''' Set the name of the directory in which the figures are stored. :param dir_name: String. Directory name. ''' error_handling.string(dir_name, 'dir_name') dir_name = self.dir_main + dir_name return dir_name
def intensity_disk(self, intensity, s=200., fs=20., lims=None, figsize=None, title=r'$|\psi|^2$'): ''' Plot the intensity. Colormap with identical disk shape. :param intensity: np.array.Field intensity. :param s: Default value 200. Disk size. :param fs: Default value 20. Font size. :param lims: List. Default value None. Colormap limits. :param figsize: Tuple. Default value None. Figure size. :param title: String. Default value '$|\psi_n|^2$'. Title. :returns: * **fig** -- Figure. ''' error_handling.empty_ndarray(self.sys.lat.coor, 'sys.get_lattice') error_handling.ndarray(intensity, 'intensity', self.sys.lat.sites) error_handling.positive_real(s, 's') error_handling.positive_real(fs, 'fs') error_handling.tuple_2elem(figsize, 'figsize') error_handling.string(title, 'title') fig, ax = plt.subplots(figsize=figsize) plt.title(title, fontsize=fs + 5) map_red = plt.get_cmap('Reds') if lims is None: lims = [0., np.max(intensity)] y_ticks = ['0', 'max'] else: y_ticks = lims plt.scatter(self.sys.lat.coor['x'], self.sys.lat.coor['y'], c=intensity, s=s, cmap=map_red, vmin=lims[0], vmax=lims[1]) cbar = plt.colorbar(ticks=lims) ax.set_xticks([]) ax.set_yticks([]) ax.set_xlim( np.min(self.sys.lat.coor['x']) - 1., np.max(self.sys.lat.coor['x']) + 1.) ax.set_ylim( np.min(self.sys.lat.coor['y']) - 1., np.max(self.sys.lat.coor['y']) + 1.) cbar.ax.set_yticklabels([y_ticks[0], y_ticks[1]]) cbar.ax.tick_params(labelsize=fs) ax.set_aspect('equal') fig.set_tight_layout(True) plt.draw() return fig
def fig_lat(self, fig, name): ''' Save the figure in the directory defined by the method *dir_name()*. :param fig: Matplotlib fig. :param name: String. First part of the file name. ''' error_handling.fig(fig) error_handling.string(name, 'name') name_file = self.dir_name + '/' + name + '.' + self.file_format fig.savefig(name_file, format=self.file_format)
def __init__(self, dir_name, dir_main=None, params={}, file_format='png'): error_handling.string(dir_name, 'dir_name') error_handling.string(dir_main, 'dir_main') error_handling.file_format(file_format) self.params = params self.file_format = file_format if dir_main is None: self.dir_main = 'figs/' else: self.dir_main = dir_name self.dir_name = self.dir_name(dir_name) self.create_dir()
def intensity_area(self, intensity, s=1000., lw=1., fs=20., plt_hop=False, figsize=None, title=r'$|\psi|^2$'): ''' Plot the intensity. Intensity propotional to disk shape. :param intensity: np.array. Intensity. :param s: Positive Float. Default value 1000. Circle size given by s * intensity. :param lw: Positive Float. Default value 1. Hopping linewidths. :param fs: Positive Float. Default value 20. Fontsize. :param plt_hop: Boolean. Default value False. Plot hoppings. :param figsize: Tuple. Default value None. Figure size. :param title: String. Default value '$|\psi_{ij}|^2$'. Figure title. :returns: * **fig** -- Figure. ''' error_handling.empty_ndarray(self.sys.lat.coor, 'sys.get_lattice') error_handling.ndarray(intensity, 'intensity', self.sys.lat.sites) error_handling.positive_real(s, 's') error_handling.positive_real(fs, 'fs') error_handling.boolean(plt_hop, 'plt_hop') error_handling.tuple_2elem(figsize, 'figsize') error_handling.string(title, 'title') fig, ax = plt.subplots() ax.set_xlabel('$i$', fontsize=fs) ax.set_ylabel('$j$', fontsize=fs) ax.set_title(title, fontsize=fs) if plt_hop: plt.plot([self.sys.lat.coor['x'][self.sys.hop['i'][:]], self.sys.lat.coor['x'][self.sys.hop['j'][:]]], [self.sys.lat.coor['y'][self.sys.hop['i'][:]], self.sys.lat.coor['y'][self.sys.hop['j'][:]]], 'k', lw=lw) for tag, color in zip(self.sys.lat.tags, self.colors): plt.scatter(self.sys.lat.coor['x'][self.sys.lat.coor['tag'] == tag], self.sys.lat.coor['y'][self.sys.lat.coor['tag'] == tag], s=100*s*intensity[self.sys.lat.coor['tag'] == tag], c=color, alpha=0.5) ax.set_aspect('equal') ax.axis('off') x_lim = [np.min(self.sys.lat.coor['x'])-2., np.max(self.sys.lat.coor['x'])+2.] y_lim = [np.min(self.sys.lat.coor['y'])-2., np.max(self.sys.lat.coor['y'])+2.] ax.set_xlim(x_lim) ax.set_ylim(y_lim) fig.set_tight_layout(True) plt.draw() return fig
def intensity_disk(self, intensity, s=200., fs=20., lims=None, figsize=None, title=r'$|\psi|^2$'): ''' Plot the intensity. Colormap with identical disk shape. :param intensity: np.array.Field intensity. :param s: Default value 200. Disk size. :param fs: Default value 20. Font size. :param lims: List. Default value None. Colormap limits. :param figsize: Tuple. Default value None. Figure size. :param title: String. Default value '$|\psi_n|^2$'. Title. :returns: * **fig** -- Figure. ''' error_handling.empty_ndarray(self.sys.lat.coor, 'sys.get_lattice') error_handling.ndarray(intensity, 'intensity', self.sys.lat.sites) error_handling.positive_real(s, 's') error_handling.positive_real(fs, 'fs') error_handling.tuple_2elem(figsize, 'figsize') error_handling.string(title, 'title') fig, ax = plt.subplots(figsize=figsize) plt.title(title, fontsize=fs+5) map_red = plt.get_cmap('Reds') if lims is None: lims = [0., np.max(intensity)] y_ticks = ['0', 'max'] else: y_ticks = lims plt.scatter(self.sys.lat.coor['x'], self.sys.lat.coor['y'], c=intensity, s=s, cmap=map_red, vmin=lims[0], vmax=lims[1]) cbar = plt.colorbar(ticks=lims) ax.set_xticks([]) ax.set_yticks([]) ax.set_xlim(np.min(self.sys.lat.coor['x'])-1., np.max(self.sys.lat.coor['x'])+1.) ax.set_ylim(np.min(self.sys.lat.coor['y'])-1., np.max(self.sys.lat.coor['y'])+1.) cbar.ax.set_yticklabels([y_ticks[0], y_ticks[1]]) cbar.ax.tick_params(labelsize=fs) ax.set_aspect('equal') fig.set_tight_layout(True) plt.draw() return fig
def butterfly(self, betas, butterfly, lw=1., fs=20., lims=None, title=''): ''' Plot energies depending on a parameter. :param betas: np.array. Parameter values. :param butterfly: np.array. Eigenvalues. :param lw: Positive Float. Default value 1. Hopping linewidths. :param fs: Positive Float. Default value 20. Fontsize. :param lims: List, lims[0] energy min, lims[1] energy max. :param title: Default value ''. Figure title. ''' error_handling.ndarray_empty(betas, 'betas') error_handling.ndarray_empty(butterfly, 'butterfly') error_handling.positive_real(lw, 'lw') error_handling.positive_real(fs, 'fs') error_handling.lims(lims) error_handling.string(title, 'title') i_beta_min = np.argmin(np.abs(betas)) if lims is None: lims = [butterfly[i_beta_min, 0], butterfly[i_beta_min, -1]] ind_en = np.argwhere((butterfly[i_beta_min, :] > lims[0]) & (butterfly[i_beta_min, :] < lims[1])) ind_en = np.ravel(ind_en) fig, ax = plt.subplots() plt.title('Energies depending on strain', fontsize=fs) plt.xlabel(r'$\beta/\beta_{max}$', fontsize=fs) plt.ylabel('$E$', fontsize=fs) ax.set_title(title, fontsize=fs) plt.yticks(np.arange(lims[0], lims[1] + 1, (lims[1] - lims[0]) / 4), fontsize=fs) plt.ylim(lims) beta_max = max(self.sys.betas) plt.xticks([-beta_max, -0.5 * beta_max, 0, 0.5 * beta_max, beta_max], fontsize=fs) ax.set_xticklabels(('-1', '-1/2', '0', '1/2', '1')) plt.xlim([betas[0], betas[-1]]) for i in ind_en: plt.plot(betas, butterfly[:, i], 'b', lw=lw) fig.set_tight_layout(True) plt.draw() return fig
def butterfly(self, betas, butterfly, lw=1., fs=20., lims=None, title=''): ''' Plot energies depending on a parameter. :param betas: np.array. Parameter values. :param butterfly: np.array. Eigenvalues. :param lw: Positive Float. Default value 1. Hopping linewidths. :param fs: Positive Float. Default value 20. Fontsize. :param lims: List, lims[0] energy min, lims[1] energy max. :param title: Default value ''. Figure title. ''' error_handling.ndarray_empty(betas, 'betas') error_handling.ndarray_empty(butterfly, 'butterfly') error_handling.positive_real(lw, 'lw') error_handling.positive_real(fs, 'fs') error_handling.lims(lims) error_handling.string(title, 'title') i_beta_min = np.argmin(np.abs(betas)) if lims is None: lims = [butterfly[i_beta_min, 0], butterfly[i_beta_min, -1]] ind_en = np.argwhere((butterfly[i_beta_min, :] > lims[0]) & (butterfly[i_beta_min, :] < lims[1])) ind_en = np.ravel(ind_en) fig, ax = plt.subplots() plt.title('Energies depending on strain', fontsize=fs) plt.xlabel(r'$\beta/\beta_{max}$', fontsize=fs) plt.ylabel('$E$', fontsize=fs) ax.set_title(title, fontsize=fs) plt.yticks(np.arange(lims[0], lims[1]+1, (lims[1]-lims[0])/4), fontsize=fs) plt.ylim(lims) beta_max = max(self.sys.betas) plt.xticks([-beta_max, -0.5*beta_max, 0, 0.5*beta_max, beta_max], fontsize=fs) ax.set_xticklabels(('-1', '-1/2', '0', '1/2', '1')) plt.xlim([betas[0], betas[-1]]) for i in ind_en: plt.plot(betas, butterfly[:, i], 'b', lw=lw) fig.set_tight_layout(True) plt.draw() return fig
def intensity_1d(self, intensity, ms=20., lw=2., fs=20., title=r'$|\psi^{(j)}|^2$'): ''' Plot intensity for 1D lattices. :param intensity: np.array. Field intensity. :param ms: Positive Float. Default value 20. Markersize. :param lw: Positive Float. Default value 2. Linewith, connect sublattice sites. :param fs: Positive Float. Default value 20. Font size. :param title: String. Default value 'Intensity'. Figure title. ''' error_handling.ndarray(intensity, 'intensity', self.sys.lat.sites) error_handling.empty_ndarray(self.sys.lat.coor, 'sys.get_lattice') error_handling.positive_real(ms, 'ms') error_handling.positive_real(lw, 'lw') error_handling.positive_real(fs, 'fs') error_handling.string(title, 'title') fig, ax = plt.subplots() ax.set_xlabel('$j$', fontsize=fs) ax.set_ylabel(title, fontsize=fs) ax.set_title(title, fontsize=fs) for t, c in zip(self.sys.lat.tags, self.colors): plt.plot(self.sys.lat.coor['x'][self.sys.lat.coor['tag'] == t], intensity[self.sys.lat.coor['tag'] == t], '-o', color=c, ms=ms, lw=lw) plt.xlim([-1., self.sys.lat.sites]) plt.ylim([0., np.max(intensity) + .05]) fig.set_tight_layout(True) plt.draw() return fig
def intensity_area(self, intensity, s=1000., lw=1., fs=20., plt_hop=False, figsize=None, title=r'$|\psi|^2$'): ''' Plot the intensity. Intensity propotional to disk shape. :param intensity: np.array. Intensity. :param s: Positive Float. Default value 1000. Circle size given by s * intensity. :param lw: Positive Float. Default value 1. Hopping linewidths. :param fs: Positive Float. Default value 20. Fontsize. :param plt_hop: Boolean. Default value False. Plot hoppings. :param figsize: Tuple. Default value None. Figure size. :param title: String. Default value '$|\psi_{ij}|^2$'. Figure title. :returns: * **fig** -- Figure. ''' error_handling.empty_ndarray(self.sys.lat.coor, 'sys.get_lattice') error_handling.ndarray(intensity, 'intensity', self.sys.lat.sites) error_handling.positive_real(s, 's') error_handling.positive_real(fs, 'fs') error_handling.boolean(plt_hop, 'plt_hop') error_handling.tuple_2elem(figsize, 'figsize') error_handling.string(title, 'title') fig, ax = plt.subplots() ax.set_xlabel('$i$', fontsize=fs) ax.set_ylabel('$j$', fontsize=fs) ax.set_title(title, fontsize=fs) if plt_hop: plt.plot([ self.sys.lat.coor['x'][self.sys.hop['i'][:]], self.sys.lat.coor['x'][self.sys.hop['j'][:]] ], [ self.sys.lat.coor['y'][self.sys.hop['i'][:]], self.sys.lat.coor['y'][self.sys.hop['j'][:]] ], 'k', lw=lw) for tag, color in zip(self.sys.lat.tags, self.colors): plt.scatter( self.sys.lat.coor['x'][self.sys.lat.coor['tag'] == tag], self.sys.lat.coor['y'][self.sys.lat.coor['tag'] == tag], s=100 * s * intensity[self.sys.lat.coor['tag'] == tag], c=color, alpha=0.5) ax.set_aspect('equal') ax.axis('off') x_lim = [ np.min(self.sys.lat.coor['x']) - 2., np.max(self.sys.lat.coor['x']) + 2. ] y_lim = [ np.min(self.sys.lat.coor['y']) - 2., np.max(self.sys.lat.coor['y']) + 2. ] ax.set_xlim(x_lim) ax.set_ylim(y_lim) fig.set_tight_layout(True) plt.draw() return fig
def ani(self, ani, name, fps=10): error_handling.ani(ani) error_handling.string(name, 'name') error_handling.positive_int(fps, 'fps') name_file = self.dir_name + '/' + name + '.mp4' ani.save(name_file, fps=fps, extra_args=['-vcodec', 'libx264'])