11import os
22import re
3+ import warnings
34from dataclasses import dataclass
45from typing import Mapping
56
@@ -1686,7 +1687,7 @@ def savefig(
16861687 layers = []
16871688 for layer in self .layers :
16881689 layers .append (layer )
1689- fig , axs = self .plot (
1690+ fig , axs = self ._render (
16901691 show = False ,
16911692 backend = "matplotlib" ,
16921693 savefig = True ,
@@ -1707,7 +1708,7 @@ def savefig(
17071708 savefig_kwargs = {"dpi" : self .dpi } if self .dpi is not None else {}
17081709 self ._matplotlib_fig .savefig (full_filepath , ** savefig_kwargs )
17091710 else :
1710- fig , axs = self .plot (
1711+ fig , axs = self ._render (
17111712 backend = "matplotlib" ,
17121713 savefig = True ,
17131714 layers = layers ,
@@ -1721,7 +1722,7 @@ def savefig(
17211722 layers = []
17221723 for layer in self .layers :
17231724 layers .append (layer )
1724- figure = self .plot (
1725+ figure = self ._render (
17251726 backend = "plotext" ,
17261727 savefig = False ,
17271728 layers = layers ,
@@ -1735,7 +1736,7 @@ def savefig(
17351736 full_filepath = filename
17361737 else :
17371738 full_filepath = f"{ filename_no_extension } _{ layers } .{ extension } "
1738- figure = self .plot (
1739+ figure = self ._render (
17391740 backend = "plotext" ,
17401741 savefig = False ,
17411742 layers = layers ,
@@ -1749,7 +1750,7 @@ def savefig(
17491750 for layer in self .layers :
17501751 layers .append (layer )
17511752 full_filepath = f"{ filename_no_extension } _{ layers } { extension } "
1752- fig = self .plot (
1753+ fig = self ._render (
17531754 backend = "plotly" ,
17541755 savefig = False ,
17551756 layers = layers ,
@@ -1763,7 +1764,7 @@ def savefig(
17631764 full_filepath = filename
17641765 else :
17651766 full_filepath = f"{ filename_no_extension } _{ layers } { extension } "
1766- fig = self .plot (
1767+ fig = self ._render (
17671768 backend = "plotly" ,
17681769 savefig = False ,
17691770 layers = layers ,
@@ -1776,12 +1777,12 @@ def savefig(
17761777 raise NotImplementedError (
17771778 "Layer-by-layer rendering is not supported for tikzfigure backend"
17781779 )
1779- fig = self .plot (backend = "tikzfigure" , savefig = False )
1780+ fig = self ._render (backend = "tikzfigure" , savefig = False )
17801781 fig .savefig (filename )
17811782 if verbose :
17821783 print (f"Saved { filename } " )
17831784
1784- def plot (
1785+ def _render (
17851786 self ,
17861787 backend : Backends = "matplotlib" ,
17871788 savefig : bool = False ,
@@ -1844,6 +1845,52 @@ def plot(
18441845 else :
18451846 raise ValueError (f"Invalid backend: { backend } " )
18461847
1848+ def plot (self , * args , backend = None , ** kwargs ):
1849+ """Add a line, or render when called with backend options.
1850+
1851+ ``canvas.plot(x, y, **style)`` is the convenient direct plotting form.
1852+ Rendering is named explicitly by ``canvas.render(...)``; the legacy
1853+ ``canvas.plot(backend=...)`` form remains supported.
1854+ """
1855+ explicit_render = backend is not None or (args and isinstance (args [0 ], str ))
1856+ if args and not isinstance (args [0 ], str ):
1857+ if len (args ) < 2 :
1858+ raise TypeError ("plot(x, y) requires both x and y data" )
1859+ if len (args ) > 2 :
1860+ raise TypeError ("plot() accepts only x and y positional data" )
1861+ layer = kwargs .pop ("layer" , 0 )
1862+ row = kwargs .pop ("row" , None )
1863+ col = kwargs .pop ("col" , None )
1864+ self .add_line (args [0 ], args [1 ], layer = layer , row = row , col = col , ** kwargs )
1865+ return self
1866+ if args :
1867+ if len (args ) > 1 :
1868+ raise TypeError (
1869+ "plot() accepts at most one backend positional argument"
1870+ )
1871+ if backend is not None :
1872+ raise TypeError ("backend was provided both positionally and by keyword" )
1873+ backend = args [0 ]
1874+ if backend is None :
1875+ backend = "matplotlib"
1876+ if explicit_render :
1877+ warnings .warn (
1878+ "canvas.plot(backend=...) is deprecated; use "
1879+ "canvas.render(backend=...) instead" ,
1880+ FutureWarning ,
1881+ stacklevel = 2 ,
1882+ )
1883+ return self ._render (backend = backend , ** kwargs )
1884+
1885+ def render (self , * args , ** kwargs ):
1886+ """Render the canvas using the selected backend.
1887+
1888+ This is the explicit name for the operation historically exposed as
1889+ ``Canvas.plot(backend=...)``. The latter remains available for
1890+ backwards compatibility.
1891+ """
1892+ return self ._render (* args , ** kwargs )
1893+
18471894 def show (
18481895 self ,
18491896 backend : Backends = "matplotlib" ,
@@ -1883,7 +1930,7 @@ def show(
18831930 if backend == "matplotlib" :
18841931 if verbose :
18851932 print ("Generating Matplotlib figure for display..." )
1886- fig , axes = self .plot (
1933+ fig , axes = self ._render (
18871934 backend = "matplotlib" ,
18881935 savefig = False ,
18891936 layers = layers ,
@@ -2621,5 +2668,5 @@ def __str__(self):
26212668 c = Canvas (ncols = 2 , nrows = 2 )
26222669 sp = c .add_subplot ()
26232670 sp .plot ([0 , 1 , 2 , 3 ], [0 , 1 , 4 , 9 ], label = "Line 1" )
2624- c .plot (backend = "matplotlib" )
2671+ c .render (backend = "matplotlib" )
26252672 print ("done" )
0 commit comments