"""Functions for plotting data."""# --- external importsimportnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.tickerastickerimportosfrommatplotlib.tickerimportMaxNLocatorfromcopyimportdeepcopyimportmatplotlib.colorsasmcolorsfrommpl_toolkits.mplot3dimportaxes3dfrommatplotlibimportrcParams# --- internal importsfromHT.functionsimportutilityasfufromHT.functionsimportmodelsasfm
[docs]defband_structure(model,args,data,plotting=False):"""Plot the Hofstadter band structure. Parameters ---------- model: Hofstadter.hamiltonian The Hofstadter Hamiltonian class attribute. args: dict The arguments passed to the program. data: ndarray The data array. plotting: bool The plotting script flag. """# read input arguments# general argumentsmod=args['model']t=args['t']lat=args['lattice']alpha=args['alpha']theta=args['theta']save=args['save']log=args['log']plt_lat=args["plot_lattice"]period=args['periodicity']dpi=args['dpi']ps=args['point_size']# band_structure argumentssamp=args['samp']wil=args['wilson']disp=args['display']nphi=args['nphi']bgt=args['bgt']# read data entrieseigenvalues=data['eigenvalues']eigenvalues_2D=data['eigenvalues_2D']wilson_loops=data['wilson_loops']# define unit cell_,avec,abasisvec,bMUCvec,sym_points=model.unit_cell()_,bases=fm.nearest_neighbor_finder(avec,abasisvec,t,0,0,0)num_bands=nphi[1]*len(bases)ifdispin["3D","both"]:# construct figurefig=plt.figure()fig.canvas.manager.set_window_title('Band Structure (3D)')ax=fig.add_subplot(111,projection='3d')ax.set_title(f"$n_\\phi = {nphi[0]}/{nphi[1]}$")idx_x=np.linspace(0,samp-1,samp,dtype=int)idx_y=np.linspace(0,samp-1,samp,dtype=int)kx,ky=np.meshgrid(idx_x,idx_y)foriinrange(num_bands):ax.plot_surface(kx,ky,eigenvalues[i,kx,ky],alpha=0.5)ax.set_xlabel('$k_1/|\\mathbf{b}_1|$')ax.set_ylabel('$k_2/|\\mathbf{b}_2|$')ax.set_zlabel('$E$')defnormalize(value,tick_number):ifvalue==0:return"$0$"elifvalue==samp-1:return"$1$"else:returnf"${value/(samp-1):.1g}$"ax.xaxis.set_major_formatter(plt.FuncFormatter(normalize))ax.yaxis.set_major_formatter(plt.FuncFormatter(normalize))ifwil:fig2=plt.figure()fig2.canvas.manager.set_window_title('Wilson Loops')ax2=fig2.add_subplot(111)ax2.set_title(f"$n_\\phi = {args['nphi'][0]}/{args['nphi'][1]}$")idx_y=np.linspace(0,samp-1,samp,dtype=int)foriinrange(num_bands):ax2.scatter(idx_y,wilson_loops[i],s=ps*rcParams['lines.markersize']**2)ax2.set_xlabel('$k_2/|\\mathbf{b}_2|$')ax2.set_ylabel('$\\prod \\theta_\\mathrm{B}$')ax2.xaxis.set_major_formatter(plt.FuncFormatter(normalize))ax2.yaxis.set_major_formatter(plt.FuncFormatter(normalize))ifdispin["2D","both"]:# define path mesh sizenum_paths=len(sym_points)points_per_path=int(samp/num_paths)num_points=num_paths*points_per_path# construct figurefig3=plt.figure()fig3.canvas.manager.set_window_title('Band Structure (2D)')ax3=fig3.add_subplot(111)ax3.set_title(f"$n_\\phi = {nphi[0]}/{nphi[1]}$")foriinrange(num_bands):ax3.plot(eigenvalues_2D[i])locations,labels=[0],[sym_points[0][0]]foriinrange(1,num_paths):ax3.axvline(i*points_per_path,color='k',linewidth=0.5,ls='--')locations.append(i*points_per_path)labels.append(sym_points[i][0])locations.append(num_paths*points_per_path)labels.append(sym_points[0][0])ax3.set_xticks(locations,labels=labels)ax3.set_xlim([0,num_points])ax3.set_xlabel('reference path')ax3.set_ylabel('$E$')ifsave:rel_path="../../.."ifplottingelse"../.."dir=f"{rel_path}/figs/band_structure/"ifos.path.isdir(f'{rel_path}/figs/band_structure/')else""ifdispin["2D","both"]:filename_2D=fu.create_filename("band_structure",args,aux_text="2D")fig3.savefig(dir+filename_2D+".png",bbox_inches='tight',dpi=dpi)ifdispin["3D","both"]:filename_3D=fu.create_filename("band_structure",args,aux_text="3D")fig.savefig(dir+filename_3D+".png",bbox_inches='tight',dpi=dpi)ifwil:fig2.savefig(dir+filename_3D.replace("band_structure_3D","wilson")+".png",bbox_inches='tight',dpi=dpi)ifplt_lat:model.plot_lattice()returnNone
[docs]defbutterfly(model,args,data,plotting=False):"""Plot the Hofstadter butterfly. Parameters ---------- model: Hofstadter.hamiltonian The Hofstadter Hamiltonian class attribute. args: dict The arguments passed to the program. data: ndarray The data array. plotting: bool The plotting script flag. """# read input arguments# general argumentsmod=args['model']t=args['t']lat=args['lattice']alpha=args['alpha']theta=args['theta']save=args['save']log=args['log']plt_lat=args["plot_lattice"]dpi=args['dpi']ps=args['point_size']# butterfly argumentsq=args['q']col=args['color']pal=args['palette']wan=args['wannier']period=args['periodicity']art=args['art']# read data entriesnphi_list=data['nphi_list']E_list=data['E_list']E_list_orig=data['E_list_orig']chern_list=data['chern_list']matrix=data['matrix']nphi_DOS_list=data['nphi_DOS_list']DOS_list=data['DOS_list']gaps_list=data['gaps_list']tr_DOS_list=data['tr_DOS_list']# construct figurefig=plt.figure()fig.canvas.manager.set_window_title('Butterfly Spectrum')ax=fig.add_subplot(111)ifnotart:ax.set_title(f"$n_\\phi = p/{q}$")transparent=Falseelse:transparent=Trueifcol:# define color paletteifpal=="jet":cmap=plt.get_cmap('jet',21)elifpal=="red-blue":colors1=plt.cm.Blues(np.linspace(0,1,10))colors2=plt.cm.seismic([0.5])ifart:colors2[:,-1]=0# set transparent region backgroundcolors3=plt.cm.Reds_r(np.linspace(0,1,10))colors=np.vstack((colors1,colors2,colors3))cmap=mcolors.LinearSegmentedColormap.from_list('red-blue',colors,21)else:# avroncolors1=plt.cm.gist_rainbow(np.linspace(0.75,1,10)[::-1])colors2=plt.cm.seismic([0.5])ifart:colors2[:,-1]=0# set transparent region backgroundcolors3=plt.cm.gist_rainbow(np.linspace(0.,0.5,10))colors=np.vstack((colors1,colors2,colors3))cmap=mcolors.LinearSegmentedColormap.from_list('avron',colors,21)ifcol=="point":sc=ax.scatter(nphi_list,E_list,c=chern_list,cmap=cmap,s=ps*7*(199/q),marker='.',vmin=-10,vmax=10,linewidths=0)ifnotart:cbar=plt.colorbar(sc,extend='both')cbar.set_label("$C$")tick_locs=np.linspace(-10,10,2*21+1)[1::2]cbar_tick_label=np.arange(-10,10+1)cbar.set_ticks(tick_locs)cbar.set_ticklabels(cbar_tick_label)elifcol=="plane":sc=ax.imshow(matrix.T,origin='lower',cmap=cmap,extent=[0,1,np.min(E_list_orig[0]),np.max(E_list_orig[0])],aspect="auto",vmin=-10,vmax=10)ifnotart:cbar=plt.colorbar(sc)cbar.set_label("$t$")tick_locs=np.linspace(-10,10,2*21+1)[1::2]cbar_tick_label=np.arange(-10,10+1)cbar.set_ticks(tick_locs)cbar.set_ticklabels(cbar_tick_label)else:nphi_list=list(np.concatenate(nphi_list).ravel())E_list=list(np.concatenate(E_list).ravel())ax.scatter(nphi_list,E_list,s=ps*7*(199/q),marker='.',linewidths=0)ifnotart:ax.set_ylabel('$E$')ax.set_xlabel('$n_\\phi$')ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('$%g$'))ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('$%g$'))ifwan:fig2=plt.figure()fig2.canvas.manager.set_window_title('Wannier Diagram')ax2=fig2.add_subplot(111)ifnotart:ax2.set_title(f"$n_\\phi = p/{q}$")ax2.set_ylabel('$N(E)$')ax2.set_xlabel('$n_\\phi$')ax2.xaxis.set_major_formatter(ticker.FormatStrFormatter('$%g$'))ax2.yaxis.set_major_formatter(ticker.FormatStrFormatter('$%g$'))else:ax2.set_xlim([0,1])nphi_DOS_list=list(np.concatenate(nphi_DOS_list).ravel())DOS_list=list(np.concatenate(DOS_list).ravel())gaps_list=list(np.concatenate(gaps_list).ravel())ifnotcol:ax2.scatter(nphi_DOS_list,DOS_list,s=[5*iforiingaps_list],c='r',linewidths=0)else:tr_DOS_list=list(np.concatenate(tr_DOS_list).ravel())sc2=ax2.scatter(nphi_DOS_list,DOS_list,s=[10*iforiingaps_list],c=tr_DOS_list,cmap=cmap,linewidths=0,vmin=-10,vmax=10)ifnotart:cbar2=plt.colorbar(sc2,extend='both')cbar2.set_label("$t$")tick_locs=np.linspace(-10,10,2*21+1)[1::2]cbar_tick_label=np.arange(-10,10+1)cbar2.set_ticks(tick_locs)cbar2.set_ticklabels(cbar_tick_label)ifart:ax.axis('off')# ax.set_box_aspect(1)ifwan:ax2.axis('off')ifsave:filename=fu.create_filename("butterfly",args)rel_path="../../../"ifplottingelse"../.."dir=f"{rel_path}/figs/butterfly/"ifos.path.isdir(f'{rel_path}/figs/butterfly/')else""fig.savefig(dir+filename+".png",bbox_inches='tight',dpi=dpi,transparent=transparent)ifwan:fig2.savefig(dir+filename.replace("butterfly","wannier")+".png",bbox_inches='tight',dpi=dpi,transparent=transparent)ifplt_lat:model.plot_lattice()returnNone