Index: src/sas/sasgui/guiframe/local_perspectives/plotting/Plotter1D.py
===================================================================
--- src/sas/sasgui/guiframe/local_perspectives/plotting/Plotter1D.py	(revision dfdc243d65f948b79cd7b91632d1fbc02b602b25)
+++ src/sas/sasgui/guiframe/local_perspectives/plotting/Plotter1D.py	(revision 5bcb6a9d87d227362da6e1e2eaa0e45a2ce29299)
@@ -671,4 +671,7 @@
         self._slicerpop.AppendSeparator()
         wx_id = ids.next()
+        self._slicerpop.Append(wx_id, '&Set Graph Range')
+        wx.EVT_MENU(self, wx_id, self.onSetRange)
+        wx_id = ids.next()
         self._slicerpop.Append(wx_id, '&Reset Graph Range')
         wx.EVT_MENU(self, wx_id, self.onResetGraph)
@@ -687,4 +690,23 @@
         self.PopupMenu(self._slicerpop, pos)
 
+    def onSetRange(self, event):
+        # Display dialog
+        # self.subplot.set_xlim((low, high))
+        # self.subplot.set_ylim((low, high))
+        from sas.sasgui.plottools.RangeDialog import RangeDialog
+        d = RangeDialog(self, -1)
+        xlim = self.subplot.get_xlim()
+        ylim = self.subplot.get_ylim()
+        d.SetXRange(xlim)
+        d.SetYRange(ylim)
+        if d.ShowModal() == wx.ID_OK:
+            x_range = d.GetXRange()
+            y_range = d.GetYRange()
+            if x_range is not None and y_range is not None:
+                self.subplot.set_xlim(x_range)
+                self.subplot.set_ylim(y_range)
+                self.subplot.figure.canvas.draw_idle()
+        d.Destroy()
+
     def onFreeze(self, event):
         """
Index: src/sas/sasgui/plottools/RangeDialog.py
===================================================================
--- src/sas/sasgui/plottools/RangeDialog.py	(revision 5bcb6a9d87d227362da6e1e2eaa0e45a2ce29299)
+++ src/sas/sasgui/plottools/RangeDialog.py	(revision 5bcb6a9d87d227362da6e1e2eaa0e45a2ce29299)
@@ -0,0 +1,101 @@
+import wx
+from math import log10
+from math import floor
+
+class RangeDialog(wx.Dialog):
+    def __init__(self, parent, id, title="Set Graph Range"):
+        wx.Dialog.__init__(self, parent, id, title, size=(350, 175))
+
+        mainbox = wx.BoxSizer(wx.VERTICAL)
+
+        x_box = wx.BoxSizer(wx.HORIZONTAL)
+
+        xmin_label = wx.StaticText(self, -1, 'xmin: ', size=(50,20))
+        x_box.Add(xmin_label)
+        self.xmin_input = wx.TextCtrl(self, -1, size=(75, -1))
+        x_box.Add(self.xmin_input)
+
+        x_box.AddSpacer(35)
+
+        xmax_label = wx.StaticText(self, -1, "xmax: ", size=(50,20))
+        x_box.Add(xmax_label)
+        self.xmax_input = wx.TextCtrl(self, -1, size=(75, -1))
+        x_box.Add(self.xmax_input)
+
+        mainbox.Add(x_box, flag=wx.CENTER | wx.ALL, border=10)
+
+        y_box = wx.BoxSizer(wx.HORIZONTAL)
+
+        ymin_label = wx.StaticText(self, -1, 'ymin: ', size=(50,20))
+        y_box.Add(ymin_label)
+        self.ymin_input = wx.TextCtrl(self, -1, size=(75, -1))
+        y_box.Add(self.ymin_input)
+
+        y_box.AddSpacer(35)
+
+        ymax_label = wx.StaticText(self, -1, "ymax: ", size=(50,20))
+        y_box.Add(ymax_label)
+        self.ymax_input = wx.TextCtrl(self, -1, size=(75, -1))
+        y_box.Add(self.ymax_input)
+
+        mainbox.Add(y_box, flag=wx.CENTER | wx.ALL, border=10)
+
+        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
+        btn_sizer.AddSpacer(20)
+
+        ok_btn = wx.Button(self, wx.ID_OK, 'Done')
+        btn_sizer.Add(ok_btn)
+
+        btn_sizer.AddSpacer(5)
+
+        cancel_btn = wx.Button(self, wx.ID_CANCEL, 'Cancel')
+        btn_sizer.Add(cancel_btn)
+
+        mainbox.Add(btn_sizer, flag=wx.CENTER, border=10)
+
+        self.SetSizer(mainbox)
+
+    def GetXRange(self):
+        xmin, xmax = (None, None)
+        try:
+            xmin = float(self.xmin_input.GetValue())
+        except:
+            pass
+        try:
+            xmax = float(self.xmax_input.GetValue())
+        except:
+            pass
+
+        if xmin is not None and xmax is not None:
+            return (xmin, xmax)
+        return None
+
+    def SetXRange(self, x_range):
+        xmin, xmax = x_range
+        self.xmin_input.SetValue(str(self._round_to_sigfig(xmin, 8)))
+        self.xmax_input.SetValue(str(self._round_to_sigfig(xmax, 8)))
+
+    def GetYRange(self):
+        ymin, ymax = (None, None)
+        try:
+            ymin = float(self.ymin_input.GetValue())
+        except:
+            pass
+        try:
+            ymax = float(self.ymax_input.GetValue())
+        except:
+            pass
+
+        if ymin is not None and ymax is not None:
+            return (ymin, ymax)
+        return None
+
+    def SetYRange(self, y_range):
+        ymin, ymax = y_range
+        self.ymin_input.SetValue(str(self._round_to_sigfig(ymin, 8)))
+        self.ymax_input.SetValue(str(self._round_to_sigfig(ymax, 8)))
+
+    def _round_to_sigfig(self, x, sigfigs):
+        if x == 0.0:
+            return 0.0
+        return round(x, sigfigs-1-int(floor(log10(abs(x)))))
