diff --git a/src/gui/DamarisGUI.py b/src/gui/DamarisGUI.py index b90daa8..ba3a66c 100644 --- a/src/gui/DamarisGUI.py +++ b/src/gui/DamarisGUI.py @@ -2959,6 +2959,7 @@ class MonitorWidgets: if self.__rescale: x_scale = self.display_x_scaling_combobox.get_active_text( ) y_scale = self.display_y_scaling_combobox.get_active_text( ) + # x-axis if x_scale == "lin": self.matplot_axes.set_xscale( "linear" ) self.matplot_axes.set_xlim(xmin, xmax) @@ -2971,7 +2972,7 @@ class MonitorWidgets: #self.display_autoscaling_checkbutton.set_active(True) #partial fix T141 self.matplot_axes.set_xlim(xmax, xmin) #self.matplot_axes.invert_xaxis() - + # y-axis if y_scale == "lin": self.matplot_axes.set_yscale( "linear" ) self.matplot_axes.set_ylim(ymin, ymax) @@ -2981,18 +2982,39 @@ class MonitorWidgets: self.__rescale = False # Autoscaling activated? - elif self.display_autoscaling_checkbutton.get_active( ): + elif self.display_autoscaling_checkbutton.get_active(): - xlim_min, xlim_max = self.matplot_axes.get_xlim( ) + xlim_min, xlim_max = self.matplot_axes.get_xlim() if xlim_min != xmin or xlim_max != xmax: - self.matplot_axes.set_xlim( xmin, xmax ) + self.matplot_axes.set_xlim(xmin, xmax) - # Rescale if new max is much larger than old ymax, simialar rules apply to ymin - ylim_min, ylim_max = self.matplot_axes.get_ylim( ) - ydiff = ymax - ymin - if (ylim_max < ymax or ylim_min > ymin or - ylim_max > ymax + 0.2 * ydiff or ylim_min < ymin - 0.2 * ydiff): - self.matplot_axes.set_ylim( ymin, ymax ) + ylim_min, ylim_max = self.matplot_axes.get_ylim() + + # Check if y-axis is log scale + yscale = self.matplot_axes.get_yscale() + + if yscale == 'log' or yscale == 'symlog': + # For log scales, work with log values to avoid issues with + # small numbers (undetected rescale) + # Use log-space calculations + log_ymin, log_ymax = numpy.log10(ymin), numpy.log10(ymax) + + log_diff = log_ymax - log_ymin + + # Add a small margin in log space (about 0.08 in log10 units ~20% margin) + new_ymin = 10**(log_ymin - 0.08 * max(log_diff, 1)) + new_ymax = 10**(log_ymax + 0.08 * max(log_diff, 1)) + + # Only update if values would change significantly + if (ylim_max < ymax or ylim_min > ymin or + ylim_max > new_ymax * 1.2 or ylim_min < new_ymin / 1.2): + self.matplot_axes.set_ylim(new_ymin, new_ymax) + else: + # Original linear scale logic + ydiff = ymax - ymin + if (ylim_max < ymax or ylim_min > ymin or + ylim_max > ymax + 0.2 * ydiff or ylim_min < ymin - 0.2 * ydiff): + self.matplot_axes.set_ylim(ymin, ymax) xdata = in_result.get_xdata( ) chans = in_result.get_number_of_channels( )