On 4/3/12 2:55 PM, Antonio Russo wrote:
Hello. I would like to be able to do an implicit_plot, but only inside a 
particular region (much like is allowed with implicit_plot3d, with its region 
option). I seem to be having trouble using Sage's revision control system 
(which is why this patch is not in the standard form), but that is another 
issue.

I have attached the patch, which is really very simple. Let me know if there is 
anything else I can do to help get this functionality added (like maybe send 
this as an attachment, which I do not see an obvious way to do).


This looks great.  The typical thing to do is:

1. Create a trac account: http://trac.sagemath.org/sage_trac/

2. Create a ticket on trac and upload the patch (attach the patch to the trac)

Please CC me on the ticket (username is jason).

Thanks,

Jason




diff --git a/sage/plot/contour_plot.py b/sage/plot/contour_plot.py
--- a/sage/plot/contour_plot.py
+++ b/sage/plot/contour_plot.py
@@ -203,7 +203,7 @@

  @suboptions('colorbar', orientation='vertical', format=None, spacing=None)
  @suboptions('label', fontsize=9, colors='blue', inline=None, inline_spacing=3, 
fmt="%1.2f")
-@options(plot_points=100, fill=True, contours=None, linewidths=None, 
linestyles=None, labels=False, frame=True, axes=False, colorbar=False, 
legend_label=None)
+@options(plot_points=100, fill=True, contours=None, linewidths=None, 
linestyles=None, labels=False, frame=True, axes=False, colorbar=False, 
legend_label=None, region=None)
  def contour_plot(f, xrange, yrange, **options):
      r"""
      ``contour_plot`` takes a function of two variables, `f(x,y)`
@@ -299,6 +299,11 @@

      - ``legend_label`` -- the label for this item in the legend

+    -  ``region`` - (default: None) If region is given, it must be a Python
+       callable. Only segments of the surface where region(x,y) returns a
+       number>0 will be included in the plot. (Note that returning a Python
+       boolean is acceptable, since True == 1 and False == 0).
+
      EXAMPLES:

      Here we plot a simple function of two variables.  Note that
@@ -467,13 +472,29 @@
      """
      from sage.plot.plot import Graphics
      from sage.plot.misc import setup_for_eval_on_grid
-    g, ranges = setup_for_eval_on_grid([f], [xrange, yrange], 
options['plot_points'])
-    g = g[0]
+
+    region = options.pop('region')
+    ev = [f] if region is None else [f,region]
+
+    F, ranges = setup_for_eval_on_grid(ev, [xrange, yrange], 
options['plot_points'])
+    g = F[0]
      xrange,yrange=[r[:2] for r in ranges]

      xy_data_array = [[g(x, y) for x in xsrange(*ranges[0], 
include_endpoint=True)]
                                for y in xsrange(*ranges[1], 
include_endpoint=True)]

+    if region is not None:
+        import numpy
+
+        xy_data_array = numpy.ma.asarray(xy_data_array,dtype=float)
+
+        m = F[1]
+
+        mask = numpy.asarray([[m(x, y)<=0 for x in xsrange(*ranges[0], 
include_endpoint=True)]
+                                          for y in xsrange(*ranges[1], 
include_endpoint=True)],dtype=bool)
+
+        xy_data_array[mask] = numpy.ma.masked
+
      g = Graphics()
      g._set_extra_kwds(Graphics._extract_kwds_for_show(options, 
ignore=['xmin', 'xmax']))
      g.add_primitive(ContourPlot(xy_data_array, xrange, yrange, options))



--
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URL: http://www.sagemath.org

Reply via email to