From c6cec9395a70bb0d3b87b4032584763d4d3e93ec Mon Sep 17 00:00:00 2001 From: Lizzzka007 <gashchuk2011@mail.ru> Date: Wed, 6 Dec 2023 05:51:16 +0300 Subject: [PATCH] Add slice --- plotter/Args.py | 4 ++- plotter/Plotter.py | 83 ++++++++++++++++++++++++++++++++++++++++++--- plotter/ProcData.py | 28 +++++++++++---- plotter/__init__.py | 1 + plotter/main.py | 6 ++++ 5 files changed, 111 insertions(+), 11 deletions(-) diff --git a/plotter/Args.py b/plotter/Args.py index e1c1947..4b81703 100644 --- a/plotter/Args.py +++ b/plotter/Args.py @@ -1,7 +1,7 @@ import sys import numpy as np class Args: - def __init__(self, filename, func, var=None, mval=None, oname=None, out=None, ndim = None, min_y = None, max_y = None, title=None, levels=None): + def __init__(self, filename, func, var=None, mval=None, oname=None, out=None, ndim = None, min_y = None, max_y = None, title=None, levels=None, plane_type = None, slice_position = None): if out == "plotter_lib_pngs/": print("Output directory name can't be equal to " + out) sys.exit(-1) @@ -17,6 +17,8 @@ class Args: self.min_y = min_y self.max_y = max_y self.levels = levels + self.plane_type = plane_type + self.slice_position = slice_position self.CorrVals() diff --git a/plotter/Plotter.py b/plotter/Plotter.py index d8effa1..3e6979c 100755 --- a/plotter/Plotter.py +++ b/plotter/Plotter.py @@ -28,6 +28,8 @@ class Plotter: self.min_y = None self.max_y = None self.min_max_var_vals = None + self.plane_type = None + self.slice_position = None def __check_arg_dim_equiv(self, args): if args.var != None and args.mval != None: @@ -42,7 +44,6 @@ class Plotter: names = d.variable_names var_names.append(np.array(names, dtype=object)) - if(len(var_names) > 1): for i in range(1, len(var_names)): if np.equal(var_names[0], var_names[i]).any() != True: @@ -67,6 +68,8 @@ class Plotter: self.title = args.title self.min_y = args.min_y self.max_y = args.max_y + self.plane_type = args.plane_type + self.slice_position = args.slice_position if args.levels != None: self.levels = args.levels @@ -77,7 +80,6 @@ class Plotter: self.if_save_result = kwargs.get('if_save_result', True) pData = [] - for fname in self.filename: p = ProcData(fname) p.get_variable_names() @@ -92,7 +94,7 @@ class Plotter: self.ndim = 1 elif args.func == self.plot_contour or args.func == self.ani_plot_contour: self.ndim = 2 - elif args.func == self.avg_plot: + elif args.func == self.avg_plot or args.func == self.slice: self.ndim = 3 if self.var == None and len(self.file_column_names) != 0: @@ -440,6 +442,75 @@ class Plotter: elif self.ndim == 2: self.__plot_contour() + def __find_closest(self, arr, val): + idx = np.abs(arr - val).argmin() + return idx + + def __slice(self): + os.system("mkdir -p " + self.out) + + if self.plane_type == 'xy': + x_name = self.file_column_names[0] + y_name = self.file_column_names[1] + + z_name = self.file_column_names[2] + arr = self.file_data[0].data[z_name] + pos = self.__find_closest(arr, self.slice_position) + + elif self.plane_type == 'yz': + x_name = self.file_column_names[1] + y_name = self.file_column_names[2] + + z_name = self.file_column_names[0] + arr = self.file_data[0].data[z_name] + pos = self.__find_closest(arr, self.slice_position) + + elif self.plane_type == 'xz': + x_name = self.file_column_names[0] + y_name = self.file_column_names[2] + + z_name = self.file_column_names[1] + arr = self.file_data[0].data[z_name] + pos = self.__find_closest(arr, self.slice_position) + + if self.oname == None: + fig_names = self.var + fig_end = ".png" + else: + fig_names = self.oname + fig_end = "" + + for i in range(self.fig_count): + fig,ax=plt.subplots(1,1) + + if self.title == None: + title = self.var[i] + else: + title = self.title + + if self.plane_type == 'xy': + Z = self.file_data[0].data[self.var[i]][pos, :, :] + + elif self.plane_type == 'xz': + Z = self.file_data[0].data[self.var[i]][:, pos, :] + + elif self.plane_type == 'yz': + Z = self.file_data[0].data[self.var[i]][:, :, pos] + + X = self.file_data[0].data[x_name] + Y = self.file_data[0].data[y_name] + + cp = ax.contourf(X, Y, Z) + + fig.colorbar(cp) # Add a colorbar to a plot + ax.set_title(title) + ax.set_xlabel(x_name) + ax.set_ylabel(y_name) + + if self.if_manual_plot: plt.show() + else: plt.close(fig) + if self.if_save_result: fig.savefig(self.out + fig_names[i] + fig_end) + def dump(self): self.__dump() @@ -472,4 +543,8 @@ class Plotter: def multiple_plot(self): self.__get_min_max_ax() - self.__multiple_plot() \ No newline at end of file + self.__multiple_plot() + + def slice(self): + self.__get_min_max_bar() + self.__slice() \ No newline at end of file diff --git a/plotter/ProcData.py b/plotter/ProcData.py index e3183eb..eeae9cf 100755 --- a/plotter/ProcData.py +++ b/plotter/ProcData.py @@ -3,6 +3,7 @@ import os import numpy as np from .binSubfunctions import * import re +from decimal import Decimal class ProcData: def __init__(self, filename=None): @@ -118,7 +119,25 @@ class ProcData: J = int(file_data[2].split(',')[1].split('=')[1]) K = int(file_data[2].split(',')[2].split('=')[1]) - file_data = np.loadtxt(self.filename, dtype = float, skiprows=3, unpack=False, ndmin=2, encoding='utf-8') + with open(self.filename, 'r') as f: + file_data = f.read().split('\n') + f.close() + + skip_rows = 0 + continue_flag = True + for row in file_data: + for word in row.split(' '): + try: + Decimal(word) + continue_flag = False + except: + break + if continue_flag == True: + skip_rows += 1 + else: + break + + file_data = np.loadtxt(self.filename, dtype = float, skiprows=skip_rows, unpack=False, ndmin=2, encoding='utf-8') file_data = file_data.T if self.var == None: @@ -135,9 +154,9 @@ class ProcData: self.data[self.variable_names[0]] = file_data[0][0:I] if ndim == 2: - self.data[self.variable_names[1]] = file_data[1][: : I] + self.data[self.variable_names[1]] = file_data[1][0: I * J : I] elif ndim == 3: - self.data[self.variable_names[1]] = file_data[1][: : I] + self.data[self.variable_names[1]] = file_data[1][0: I * J : I] self.data[self.variable_names[2]] = file_data[2][: : I * J] i = 0 @@ -154,7 +173,6 @@ class ProcData: self.data['cy'] = J self.data['cz'] = K - def __read_bin(self): f = open(self.filename,'rb') fid = read_int(f) @@ -312,8 +330,6 @@ class ProcData: self.var = column_names self.mval = mval - # print(ndim, self.filename) - if filename_extension == '.plt': self.__read_plt(ndim) elif filename_extension == '.nsx': diff --git a/plotter/__init__.py b/plotter/__init__.py index 4c896fe..ae8d0c6 100755 --- a/plotter/__init__.py +++ b/plotter/__init__.py @@ -6,6 +6,7 @@ from .main import ani_plot from .main import plot_contour from .main import ani_plot_contour from .main import avg_plot +from .main import slice from .main import plot_diff from .main import get_data from .main import multiple_plot diff --git a/plotter/main.py b/plotter/main.py index 7c9e069..c8de57a 100755 --- a/plotter/main.py +++ b/plotter/main.py @@ -66,6 +66,12 @@ def avg_plot(filename, out = './', oname = 'fig.png', var=[None], mval=[None]): Plot.set(args, if_manual_plot=manual_plot, if_save_result=save_result) Plot.avg_plot() +def slice(filename, plane_type = 'xy', slice_position = 0, out = './', oname = [None], var=[None], mval=[None], min_y = None, max_y = None): + Plot = Plotter() + args = Args([filename], Plot.slice, var=var, mval=mval, oname=oname, out=out, plane_type=plane_type, slice_position=slice_position) + Plot.set(args, if_manual_plot=manual_plot, if_save_result=save_result) + Plot.slice() + def plot_diff(filename, ndim, out = './', oname = 'fig.png', var=[None], mval=[None]): Plot = Plotter() args = Args(filename, Plot.plot_diff, var=var, mval=mval, oname=oname, out=out, ndim=ndim) -- GitLab