Hi Fred,

hmm, I don't fully understand your application.

Anyhow, you can use setLimitsToFit and *thereafter* transfer the limits of one axis (here the x axis) and also its 'log' property with plot.useTemplate (having the Plot.X_RANGE+Plot.COPY_AXIS_STYLE flags).

As long as you don't specify the Plot.Y_RANGE or Plot.ALL_AXES_RANGE flags, the limits in y won't be affected by useTemplate, and will remain as set by setLimitsToFit.

In other words, plot.setLimitsToFit just sets the values of the limits once when you call it. It does not make the plot behave a different way in the future. Plot.setLimitsToFit is the equivalent to clicking the gray "F" in the bottom-left corner of the plot with the mouse; you can change the limits thereafter as you like.

Simply try it.

------------------------------

A side note:

It is safer to combine flags with bitwise OR, e.g.
  Plot.X_RANGE | Plot.COPY_AXIS_STYLE

In most cases it makes no difference, but sometimes it does, if one flag gets specified twice.
E.g. I can have
  defaultFlags = COPY_SIZE | COPY_CONTENTS_STYLE;
and somewhere later in the code
  moreFlags = defaultFlags | COPY_LEGEND | COPY_EXTRA_OBJECTS;
This works with either bitwise OR (|) or adding (+).

A year later I change the first line to
  defaultFlags = COPY_SIZE | COPY_CONTENTS_STYLE | COPY_LEGEND;
because I find out that I always want to copy the legend. Further down, I still have (but I don't remember any more after a year)
  moreFlags = defaultFlags | COPY_LEGEND | COPY_EXTRA_OBJECTS;
With the bitwise OR, it is ok:
  COPY_LEGEND | COPY_LEGEND = 0x40 | 0x40 = 0x40

However, after changing the defaultFlags to include COPY_LEGEND, it won't work if I had used '+' signs:
  moreFlags = defaultFlags + COPY_LEGEND + COPY_EXTRA_OBJECTS;
Now we will have COPY_LEGEND twice in the sum.
  COPY_LEGEND + COPY_LEGEND = 0x40 + 0x40 = 0x80
This clears the COPY_LEGEND flag, and flag 0x80 = COPY_AXIS_STYLE will be set.

Similarily, we have
X_RANGE = 0x1;
Y_RANGE = 0x2;
ALL_AXES_RANGE = X_RANGE | Y_RANGE; //= 0x3
You may combine them with
  X_RANGE | ALL_AXES_RANGE, but *not*
  X_RANGE + ALL_AXES_RANGE
because the latter would be 1 + 3 = 4, and neither X_RANGE nor Y_RANGE will be included in the result.

(For readability, I have omitted the preceding "Plot." for the flag names)

Best,

Michael
________________________________________________________________
On 25.01.24 19:49, Fred Damen wrote:
Greetings Michael,

So... Is there a way to get the plot.useTemplate to override the
plot.setLimitsToFit, e.g., place plot.useTemplate after
plot.setLimitsToFit in the code???

The reason I ask is that the actual plotting code is generic standalone
plugin and sometimes, as determined when viewing the plots, the user would
like to view the results of a different ROI in the same format... In the
case here, the only thing that changes is the y values. In the actual code
there are 6 y curves plotted, and thus the use of plot.setLimitsToFit. If
I were to implement this fancy limiting in my code using plot.setLimits
would plot.useTemplate still not dominate?


Thanks,

Fred

On Thu, January 25, 2024 4:06 am, Michael Schmid wrote:
Hi Fred,

your data contain the value x=0. Thus, plot.setLimitsToFit forces the
plot to include the value x=0, which forces the x axis to be linear, not
logarithmic.
If you have only positive data, or if you don't call setLimitsToFit,
useTemplate with Plot.COPY_AXIS_STYLE keeps the axis logarithmic.

Michael
________________________________________________________________
On 25.01.24 00:42, Fred Damen wrote:
Greeting,

I am trying to maintain the logarithmic axis through successive plots,
see
below. To reproduce, you...

Run the below plugin.
Click "Press me"
Choose More>> Set Range...
Set X From to 0.1
Set Log X Axis
Click OK
Click "Press me"
The X axis is no longer logarithmic.
Choosing More>> Set Range...
reveals that X From is now "0" again, albeit Log X Axis is still set...

Q: Is just X_RANGE required for my requirement, or is COPY_AXIS_STYLE
also
required?

Fred



import ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import java.awt.event.*;
import ij.plugin.*;
import ij.plugin.frame.*;

public class TestuseTemplate implements PlugIn {

     PlotWindow pwin = null;
     Plot prevPlot = null;
     public void run(String arg) {
        GenericDialog gd = new NonBlockingGenericDialog("test
useTemplate");
        gd.addButton("Press me",new ActionListener() {
           public void actionPerformed(ActionEvent e) {
              Plot plot = new Plot("Title", "X", "Y");
              plot.addPoints(new float[]{0,10,100,1000},new
float[]{0,10,100,1000},Plot.LINE);

              if (prevPlot != null)
                 plot.useTemplate(prevPlot,
Plot.COPY_SIZE+Plot.X_RANGE+Plot.COPY_AXIS_STYLE);

              if (pwin==null)
                 pwin = plot.show();
              else
                 pwin.drawPlot(plot);
              plot.setLimitsToFit(true);

              prevPlot = plot;
              }
           });
        gd.showDialog();
        }

}

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html


--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

Reply via email to