From cfdf94e0ca75260d7f0c9de1e4b62602d4260ad1 Mon Sep 17 00:00:00 2001 From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de> Date: Fri, 20 Nov 2020 13:48:20 +0100 Subject: [PATCH] plot_int: provide variious options for y axis --- Examples/Python/utils/plot_int.py | 51 +++++++++++++++++++------------ 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/Examples/Python/utils/plot_int.py b/Examples/Python/utils/plot_int.py index 6c98fbb17fe..44690432c2a 100755 --- a/Examples/Python/utils/plot_int.py +++ b/Examples/Python/utils/plot_int.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 - -Helptext = ''' +''' Plots data stored in BornAgain's .int or .int.gz format. Can handle both 1D and 2D arrays. -Usage: plot_int.py intensity_file.int.gz [intensity_max] ''' import argparse @@ -18,30 +16,43 @@ rc('text', usetex=True) def plot_int(args): data = ba.IntensityDataIOFactory.readIntensityData(args.file) - if args.max is None: + if args.max is not None: + intensity_max = args.max + else: intensity_max = data.getMaximum() + if args.min is not None: + intensity_min = args.min + else: + intensity_min = data.getMinimum() + ylog = not args.ylin + if ylog and intensity_min<=0: + intensity_min = intensity_max / 1e6 if args.verbose: print(f'Data extend from {data.getMinimum()} to {data.getMaximum()}') if data.rank() == 1: - plot_int_1d(data, intensity_max) + plot_int_1d(data, ylog, intensity_min, intensity_max) elif data.rank() == 2: - plot_int_2d(data, intensity_max) + plot_int_2d(data, ylog, intensity_min, intensity_max) else: exit("Error in plot_int: wrong data rank") -def plot_int_2d(histogram, intensity_max): +def plot_int_2d(histogram, ylog, intensity_min, intensity_max): plot_raw_data_2d(histogram.array(), [ histogram.getXmin()/ba.deg, histogram.getXmax()/ba.deg, histogram.getYmin()/ba.deg, histogram.getYmax()/ba.deg - ], intensity_max) + ], ylog, intensity_min, intensity_max) -def plot_raw_data_2d(values, extent_array, intensity_max): +def plot_raw_data_2d(values, extent_array, ylog, intensity_min, intensity_max): + if ylog: + norm = colors.LogNorm(intensity_min, intensity_max) + else: + norm = colors.Normalize(intensity_min, intensity_max) im = plt.imshow(values, - norm=colors.LogNorm(1.0, intensity_max), + norm=norm, extent=extent_array, aspect='auto') cb = plt.colorbar(im) @@ -51,14 +62,15 @@ def plot_raw_data_2d(values, extent_array, intensity_max): plt.show() -def plot_int_1d(histogram, intensity_max): +def plot_int_1d(histogram, ylog, intensity_min, intensity_max): + # TODO use intensity_min, intensity_max, which are currently ignored axis_values = np.asarray(histogram.xAxis().binCenters())/ba.deg - array_values = histogram.array()*intensity_max/histogram.getMaximum() - plot_raw_data_1d(axis_values, array_values) + array_values = histogram.array() + plot_raw_data_1d(axis_values, array_values, ylog) -def plot_raw_data_1d(axis, values, log_y=True): - if log_y: +def plot_raw_data_1d(axis, values, ylog): + if ylog: plt.semilogy(axis, values) else: plt.plot(axis, values) @@ -69,12 +81,13 @@ def plot_raw_data_1d(axis, values, log_y=True): if __name__ == '__main__': parser = argparse.ArgumentParser() - parser.add_argument("-v", "--verbose", help="print some output to the terminal", - action="store_true") + parser.add_argument("-v", "--verbose", action="store_true", + help="print some output to the terminal") parser.add_argument("file", type=str, help="input data file (.int or .int.gz)") - parser.add_argument("-u", "--min", type=int, help="upper plot limit") - parser.add_argument("-l", "--max", type=int, help="lower plot limit") + parser.add_argument("-l", "--min", type=float, help="upper plot limit") + parser.add_argument("-u", "--max", type=float, help="lower plot limit") + parser.add_argument("-y", "--ylin", action="store_true", help="linear y scale", ) args = parser.parse_args() plot_int(args) -- GitLab