def plot(self, ifield=0, cut=0.5, levels=12, cmap='RdYlBu_r', png=False, step=1, normed=False, dpi=80, bgcolor=None, deminc=True, ic=False): """ Plotting function (it can also write the png files) :param ifield: in case of a multiple-field movie file, you can change the default field displayed using the parameter ifield :type ifield: int :param levels: number of contour levels :type levels: int :param cmap: name of the colormap :type cmap: str :param cut: adjust the contour extrema to max(abs(data))*cut :type cut: float :param png: save the movie as a series of png files when set to True :type png: bool :param dpi: dot per inch when saving PNGs :type dpi: int :param bgcolor: background color of the figure :type bgcolor: str :param normed: the colormap is rescaled every timestep when set to True, otherwise it is calculated from the global extrema :type normed: bool :param step: the stepping between two timesteps :type step: int :param deminc: a logical to indicate if one wants do get rid of the possible azimuthal symmetry :type deminc: bool """ if png: plt.ioff() if not os.path.exists('movie'): os.mkdir('movie') else: plt.ion() if not normed: vmin = -max(abs(self.data[ifield, ...].max()), abs(self.data[ifield, ...].min())) vmin = cut * vmin vmax = -vmin # vmin, vmax = self.data.min(), self.data.max() cs = np.linspace(vmin, vmax, levels) if self.surftype == 'phi_constant': if self.n_theta_plot == self.n_theta_max: th = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) fig = plt.figure(figsize=(4, 8)) th0 = th else: th0 = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) th1 = np.linspace(np.pi / 2., 3. * np.pi / 2., self.n_theta_max) th = np.concatenate((th0, th1)) fig = plt.figure(figsize=(6.5, 6)) # Plotting trick using th0 th0 = np.linspace(np.pi / 2, np.pi / 2 + 2. * np.pi, 2 * self.n_theta_max) rr, tth = np.meshgrid(self.radius, th) xx = rr * np.cos(tth) yy = rr * np.sin(tth) xxout = rr.max() * np.cos(th0) yyout = rr.max() * np.sin(th0) xxin = rr.min() * np.cos(th0) yyin = rr.min() * np.sin(th0) if ic: rr, tth = np.meshgrid(self.radius_ic, th) xx_ic = rr * np.cos(tth) yy_ic = rr * np.sin(tth) elif self.surftype == 'r_constant': th = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) if deminc: phi = np.linspace(-np.pi, np.pi, self.n_phi_tot * self.minc + 1) xxout, yyout = hammer2cart(th, -np.pi) xxin, yyin = hammer2cart(th, np.pi) else: phi = np.linspace(-np.pi / self.minc, np.pi / self.minc, self.n_phi_tot) xxout, yyout = hammer2cart(th, -np.pi / self.minc) xxin, yyin = hammer2cart(th, np.pi / self.minc) ttheta, pphi = np.meshgrid(th, phi) xx, yy = hammer2cart(ttheta, pphi) fig = plt.figure(figsize=(8, 4)) elif self.surftype == 'theta_constant': if deminc: phi = np.linspace(0., 2. * np.pi, self.n_phi_tot * self.minc + 1) else: phi = np.linspace(0., 2. * np.pi / self.minc, self.n_phi_tot) rr, pphi = np.meshgrid(self.radius, phi) xx = rr * np.cos(pphi) yy = rr * np.sin(pphi) xxout = rr.max() * np.cos(pphi) yyout = rr.max() * np.sin(pphi) xxin = rr.min() * np.cos(pphi) yyin = rr.min() * np.sin(pphi) if ic: rr, pphi = np.meshgrid(self.radius_ic, phi) xx_ic = rr * np.cos(pphi) yy_ic = rr * np.sin(pphi) fig = plt.figure(figsize=(6, 6)) elif self.surftype == '3d volume': self.data = self.data[ifield, ..., 0] th = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) phi = np.linspace(-np.pi, np.pi, self.n_phi_tot) ttheta, pphi = np.meshgrid(th, phi) xx, yy = hammer2cart(ttheta, pphi) xxout, yyout = hammer2cart(th, -np.pi) xxin, yyin = hammer2cart(th, np.pi) fig = plt.figure(figsize=(8, 4)) fig.subplots_adjust(top=0.99, right=0.99, bottom=0.01, left=0.01) ax = fig.add_subplot(111, frameon=False) for k in range(self.nvar): if k == 0: if normed: vmin = -max(abs(self.data[ifield, k, ...].max()), abs(self.data[ifield, k, ...].min())) vmin = cut * vmin vmax = -vmin cs = np.linspace(vmin, vmax, levels) if self.surftype in ['r_constant', 'theta_constant']: if deminc: dat = symmetrize(self.data[ifield, k, ...], self.minc) if ic: datic = symmetrize(self.data_ic[ifield, k, ...], self.minc) else: dat = self.data[ifield, k, ...] if ic: datic = self.data_ic[ifield, k, ...] im = ax.contourf(xx, yy, dat, cs, cmap=cmap, extend='both') if ic: ax.contourf(xx_ic, yy_ic, datic, cs, cmap=cmap, extend='both') else: im = ax.contourf(xx, yy, self.data[ifield, k, ...], cs, cmap=cmap, extend='both') if ic: im_ic = ax.contourf(xx_ic, yy_ic, self.data_ic[ifield, k, ...], cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.axis('off') man = plt.get_current_fig_manager() man.canvas.draw() if k != 0 and k % step == 0: if not png: print(k + self.var2 - self.nvar) plt.cla() if normed: vmin = -max(abs(self.data[ifield, k, ...].max()), abs(self.data[ifield, k, ...].min())) vmin = cut * vmin vmax = -vmin cs = np.linspace(vmin, vmax, levels) if self.surftype in ['r_constant', 'theta_constant']: if deminc: dat = symmetrize(self.data[ifield, k, ...], self.minc) if ic: datic = symmetrize(self.data_ic[ifield, k, ...], self.minc) else: dat = self.data[ifield, k, ...] if ic: datic = self.data_ic[ifield, k, ...] ax.contourf(xx, yy, dat, cs, cmap=cmap, extend='both') if ic: ax.contourf(xx_ic, yy_ic, datic, cs, cmap=cmap, extend='both') else: ax.contourf(xx, yy, self.data[ifield, k, ...], cs, cmap=cmap, extend='both') if ic: ax.contourf(xx_ic, yy_ic, self.data_ic[ifield, k, ...], cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.axis('off') man.canvas.draw() if png: filename = 'movie/img{:05d}.png'.format(k) print('write {}'.format(filename)) # st = 'echo {}'.format(ivar) + ' > movie/imgmax' if bgcolor is not None: fig.savefig(filename, facecolor=bgcolor, dpi=dpi) else: fig.savefig(filename, dpi=dpi)
def avgStd(self, ifield=0, std=False, cut=0.5, levels=12, cmap='RdYlBu_r', ic=False): """ Plot time-average or standard deviation :param ifield: in case of a multiple-field movie file, you can change the default field displayed using the parameter ifield :type ifield: int :param std: the standard deviation is computed instead the average when std is True :type std: bool :param levels: number of contour levels :type levels: int :param cmap: name of the colormap :type cmap: str :param cut: adjust the contour extrema to max(abs(data))*cut :type cut: float """ if std: avg = self.data[ifield, ...].std(axis=0) if ic: avg_ic = self.data_ic[ifield, ...].std(axis=0) else: avg = self.data[ifield, ...].mean(axis=0) if ic: avg_ic = self.data_ic[ifield, ...].mean(axis=0) vmin = -max(abs(avg.max()), abs(avg.min())) vmin = cut * vmin vmax = -vmin cs = np.linspace(vmin, vmax, levels) if self.surftype == 'phi_constant': if self.n_theta_plot == self.n_theta_max: th = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) fig = plt.figure(figsize=(4, 8)) th0 = th else: th0 = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) th1 = np.linspace(np.pi / 2., 3. * np.pi / 2., self.n_theta_max) th = np.concatenate((th0, th1)) fig = plt.figure(figsize=(6.5, 6)) # Plotting trick using th0 th0 = np.linspace(np.pi / 2, np.pi / 2 + 2. * np.pi, 2 * self.n_theta_max) rr, tth = np.meshgrid(self.radius, th) xx = rr * np.cos(tth) yy = rr * np.sin(tth) xxout = rr.max() * np.cos(th0) yyout = rr.max() * np.sin(th0) xxin = rr.min() * np.cos(th0) yyin = rr.min() * np.sin(th0) if ic: rr, tth = np.meshgrid(self.radius_ic, th) xx_ic = rr * np.cos(tth) yy_ic = rr * np.sin(tth) elif self.surftype == 'r_constant': th = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) phi = np.linspace(-np.pi, np.pi, self.n_phi_tot) ttheta, pphi = np.meshgrid(th, phi) xx, yy = hammer2cart(ttheta, pphi) xxout, yyout = hammer2cart(th, -np.pi) xxin, yyin = hammer2cart(th, np.pi) fig = plt.figure(figsize=(8, 4)) elif self.surftype == 'theta_constant': phi = np.linspace(0., 2. * np.pi, self.n_phi_tot) rr, pphi = np.meshgrid(self.radius, phi) xx = rr * np.cos(pphi) yy = rr * np.sin(pphi) xxout = rr.max() * np.cos(pphi) yyout = rr.max() * np.sin(pphi) xxin = rr.min() * np.cos(pphi) yyin = rr.min() * np.sin(pphi) fig = plt.figure(figsize=(6, 6)) elif self.surftype == '3d volume': self.data = self.data[ifield, ..., 0] th = np.linspace(np.pi / 2., -np.pi / 2., self.n_theta_max) phi = np.linspace(-np.pi, np.pi, self.n_phi_tot) ttheta, pphi = np.meshgrid(th, phi) xx, yy = hammer2cart(ttheta, pphi) xxout, yyout = hammer2cart(th, -np.pi) xxin, yyin = hammer2cart(th, np.pi) fig = plt.figure(figsize=(8, 4)) fig.subplots_adjust(top=0.99, right=0.99, bottom=0.01, left=0.01) ax = fig.add_subplot(111, frameon=False) ax.contourf(xx, yy, avg, cs, cmap=cmap, extend='both') if ic: ax.contourf(xx_ic, yy_ic, avg_ic, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.axis('off')