def plot_paths_2d(self, start_sys, end_sys, input_ring, c_skew = .001, endpoints = True, saved_start = None, rand_colors = False): """ This returns a graphics object of solution paths in the complex plane. INPUT: - start_sys -- a square polynomial system, given as a list of polynomials - end_sys -- same type as start_sys - input_ring -- for coercion of the variables into the desired ring. - c_skew -- optional. the imaginary part of homotopy multiplier; nonzero values are often necessary to avoid intermediate path collisions - endpoints -- optional. Whether to draw in the ends of paths as points. - saved_start -- optional. A phc output file. If not given, start system solutions are computed via the phc.blackbox function. OUTPUT: - lines and points of solution paths EXAMPLES:: sage: from sage.interfaces.phc import * sage: from sage.structure.sage_object import SageObject sage: R2.<x,y> = PolynomialRing(QQ,2) sage: start_sys = [x^5-y^2,y^5-1] sage: sol = phc.blackbox(start_sys, R2) # optional -- phc sage: start_save = sol.save_as_start() # optional -- phc sage: end_sys = [x^5-25,y^5-x^2] # optional -- phc sage: testing = phc.plot_paths_2d(start_sys, end_sys, R2) # optional -- phc sage: type(testing) # optional -- phc (normally use plot here) <class 'sage.plot.graphics.Graphics'> """ paths = phc.path_track(start_sys, end_sys, input_ring, c_skew = c_skew, saved_start = saved_start) path_lines = [] sol_pts = [] if rand_colors: r_color = {} for a_var in input_ring.gens(): var_name = str(a_var) r_color[var_name] = (random(),random(),random()) for a_sol in paths: for a_var in input_ring.gens(): var_name = str(a_var) temp_line = [] for data in a_sol: temp_line.append([data[var_name].real(), data[var_name].imag()]) if rand_colors: path_lines.append(line(temp_line, rgbcolor = r_color[var_name])) else: path_lines.append(line(temp_line)) if endpoints: sol_pts = [] for a_sol in paths: for a_var in input_ring.gens(): var_name = str(a_var) sol_pts.append(point([a_sol[0][var_name].real(), a_sol[0][var_name].imag()])) sol_pts.append(point([a_sol[-1][var_name].real(), a_sol[-1][var_name].imag()])) return sum(sol_pts) + sum(path_lines) else: return sum(path_lines)
def _plot2d_single_y(self, Xcol, Ycol, *args, **keywords): '''\ A simple plotting function for a single Y variable ''' #set default plot parameters #if 'plotjoined' not in keywords: # keywords['plotjoined']=True; if 'frame' not in keywords: keywords['frame'] = True if 'axes' not in keywords: keywords['axes'] = False if 'axes_pad' not in keywords: keywords['axes_pad'] = 0 if 'axes_labels_size' not in keywords: keywords['axes_labels_size'] = 1 #plot! #from sage.plot.plot import list_plot # list_plot does not accept any args - it only treat the second arg as a plotjoined value # so we skip passing *args into.. pj = keywords.pop('plotjoined', True) #print(pj) # DEBUG if (pj): from sage.plot.plot import line return line(zip(Xcol, Ycol), **keywords) else: from sage.plot.point import points return points(zip(Xcol, Ycol), **keywords)
def plot(self, color='rainbow', orientation='bottom-top', gap=0.05, aspect_ratio=1, axes=False, **kwds): """ Plot the braid The following options are available: - ``color`` -- (default: ``'rainbow'``) the color of the strands. Possible values are: * ``'rainbow'``, uses :meth:`~sage.plot.colors.rainbow` according to the number of strands. * a valid color name for :meth:`~sage.plot.bezier_path` and :meth:`~sage.plot.line`. Used for all strands. * a list or a tuple of colors for each individual strand. - ``orientation`` -- (default: ``'bottom-top'``) determines how the braid is printed. The possible values are: * ``'bottom-top'``, the braid is printed from bottom to top * ``'top-bottom'``, the braid is printed from top to bottom * ``'left-right'``, the braid is printed from left to right - ``gap`` -- floating point number (default: 0.05). determines the size of the gap left when a strand goes under another. - ``aspect_ratio`` -- floating point number (default: ``1``). The aspect ratio. - ``**kwds`` -- other keyword options that are passed to :meth:`~sage.plot.bezier_path` and :meth:`~sage.plot.line`. EXAMPLES:: sage: B = BraidGroup(4, 's') sage: b = B([1, 2, 3, 1, 2, 1]) sage: b.plot() sage: b.plot(color=["red", "blue", "red", "blue"]) sage: B.<s,t> = BraidGroup(3) sage: b = t^-1*s^2 sage: b.plot(orientation="left-right", color="red") """ from sage.plot.bezier_path import bezier_path from sage.plot.plot import Graphics, line from sage.plot.colors import rainbow if orientation=='top-bottom': orx = 0 ory = -1 nx = 1 ny = 0 elif orientation=='left-right': orx = 1 ory = 0 nx = 0 ny = -1 elif orientation=='bottom-top': orx = 0 ory = 1 nx = 1 ny = 0 else: raise ValueError('unknown value for "orientation"') n = self.strands() if isinstance(color, (list, tuple)): if len(color) != n: raise TypeError("color (=%s) must contain exactly %d colors" % (color, n)) col = list(color) elif color == "rainbow": col = rainbow(n) else: col = [color]*n braid = self.Tietze() a = Graphics() op = gap for i, m in enumerate(braid): for j in range(n): if m==j+1: a += bezier_path([[(j*nx+i*orx, i*ory+j*ny), (j*nx+orx*(i+0.25), j*ny+ory*(i+0.25)), (nx*(j+0.5)+orx*(i+0.5), ny*(j+0.5)+ory*(i+0.5))], [(nx*(j+1)+orx*(i+0.75), ny*(j+1)+ory*(i+0.75)), (nx*(j+1)+orx*(i+1), ny*(j+1)+ory*(i+1))]], color=col[j], **kwds) elif m==j: a += bezier_path([[(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+0.25), ny*j+ory*(i+0.25)), (nx*(j-0.5+4*op)+orx*(i+0.5-2*op), ny*(j-0.5+4*op)+ory*(i+0.5-2*op)), (nx*(j-0.5+2*op)+orx*(i+0.5-op), ny*(j-0.5+2*op)+ory*(i+0.5-op))]], color=col[j], **kwds) a += bezier_path([[(nx*(j-0.5-2*op)+orx*(i+0.5+op), ny*(j-0.5-2*op)+ory*(i+0.5+op)), (nx*(j-0.5-4*op)+orx*(i+0.5+2*op), ny*(j-0.5-4*op)+ory*(i+0.5+2*op)), (nx*(j-1)+orx*(i+0.75), ny*(j-1)+ory*(i+0.75)), (nx*(j-1)+orx*(i+1), ny*(j-1)+ory*(i+1))]], color=col[j], **kwds) col[j], col[j-1] = col[j-1], col[j] elif -m==j+1: a += bezier_path([[(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+0.25), ny*j+ory*(i+0.25)), (nx*(j+0.5-4*op)+orx*(i+0.5-2*op), ny*(j+0.5-4*op)+ory*(i+0.5-2*op)), (nx*(j+0.5-2*op)+orx*(i+0.5-op), ny*(j+0.5-2*op)+ory*(i+0.5-op))]], color=col[j], **kwds) a += bezier_path([[(nx*(j+0.5+2*op)+orx*(i+0.5+op), ny*(j+0.5+2*op)+ory*(i+0.5+op)), (nx*(j+0.5+4*op)+orx*(i+0.5+2*op), ny*(j+0.5+4*op)+ory*(i+0.5+2*op)), (nx*(j+1)+orx*(i+0.75), ny*(j+1)+ory*(i+0.75)), (nx*(j+1)+orx*(i+1), ny*(j+1)+ory*(i+1))]], color=col[j], **kwds) elif -m==j: a += bezier_path([[(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+0.25), ny*j+ory*(i+0.25)), (nx*(j-0.5)+orx*(i+0.5), ny*(j-0.5)+ory*(i+0.5))], [(nx*(j-1)+orx*(i+0.75), ny*(j-1)+ory*(i+0.75)), (nx*(j-1)+orx*(i+1), ny*(j-1)+ory*(i+1))]], color=col[j], **kwds) col[j], col[j-1] = col[j-1], col[j] else: a += line([(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+1), ny*j+ory*(i+1))], color=col[j], **kwds) a.set_aspect_ratio(aspect_ratio) a.axes(axes) return a
def plot(self, color='blue', orientation='bottom-top', gap=0.05, aspect_ratio=1, axes=False, **kwds): """ Plot the braid The following options are available: - ``orientation`` - (default: ``'bottom-top'``) determines how the braid is printed. The possible values are: * ``'bottom-top'``, the braid is printed from bottom to top * ``'top-bottom'``, the braid is printed from top to bottom * ``'left-right'``, the braid is printed from left to right - ``gap`` -- floating point number (default: 0.05). determines the size of the gap left when a strand goes under another. - ``aspect_ratio`` -- floating point number (default: ``1``). The aspect ratio. - ``**kwds`` -- other keyword options that are passed to :meth:`~sage.plot.bezier_path` and :meth:`~sage.plot.line`. EXAMPLES:: sage: B = BraidGroup(4, 's') sage: b = B([1, 2, 3, 1, 2, 1]) sage: b.plot() """ from sage.plot.bezier_path import bezier_path from sage.plot.plot import Graphics, line if orientation=='top-bottom': orx = 0 ory = -1 nx = 1 ny = 0 elif orientation=='left-right': orx = 1 ory = 0 nx = 0 ny = -1 elif orientation=='bottom-top': orx = 0 ory = 1 nx = 1 ny = 0 else: raise ValueError('unknown value for "orientation"') col = color br = self.Tietze() n = self.strands() a = Graphics() op = gap for i in range(len(br)): m = br[i] for j in range(n): if m==j+1: a += bezier_path([[(j*nx+i*orx, i*ory+j*ny), (j*nx+orx*(i+0.25), j*ny+ory*(i+0.25)), (nx*(j+0.5)+orx*(i+0.5), ny*(j+0.5)+ory*(i+0.5))], [(nx*(j+1)+orx*(i+0.75), ny*(j+1)+ory*(i+0.75)), (nx*(j+1)+orx*(i+1), ny*(j+1)+ory*(i+1))]], color=col, **kwds) elif m==j: a += bezier_path([[(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+0.25), ny*j+ory*(i+0.25)), (nx*(j-0.5+4*op)+orx*(i+0.5-2*op), ny*(j-0.5+4*op)+ory*(i+0.5-2*op)), (nx*(j-0.5+2*op)+orx*(i+0.5-op), ny*(j-0.5+2*op)+ory*(i+0.5-op))]], color=col, **kwds) a += bezier_path([[(nx*(j-0.5-2*op)+orx*(i+0.5+op), ny*(j-0.5-2*op)+ory*(i+0.5+op)), (nx*(j-0.5-4*op)+orx*(i+0.5+2*op), ny*(j-0.5-4*op)+ory*(i+0.5+2*op)), (nx*(j-1)+orx*(i+0.75), ny*(j-1)+ory*(i+0.75)), (nx*(j-1)+orx*(i+1), ny*(j-1)+ory*(i+1))]], color=col, **kwds) elif -m==j+1: a += bezier_path([[(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+0.25), ny*j+ory*(i+0.25)), (nx*(j+0.5-4*op)+orx*(i+0.5-2*op), ny*(j+0.5-4*op)+ory*(i+0.5-2*op)), (nx*(j+0.5-2*op)+orx*(i+0.5-op), ny*(j+0.5-2*op)+ory*(i+0.5-op))]], color=col, **kwds) a += bezier_path([[(nx*(j+0.5+2*op)+orx*(i+0.5+op), ny*(j+0.5+2*op)+ory*(i+0.5+op)), (nx*(j+0.5+4*op)+orx*(i+0.5+2*op), ny*(j+0.5+4*op)+ory*(i+0.5+2*op)), (nx*(j+1)+orx*(i+0.75), ny*(j+1)+ory*(i+0.75)), (nx*(j+1)+orx*(i+1), ny*(j+1)+ory*(i+1))]], color=col, **kwds) elif -m==j: a += bezier_path([[(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+0.25), ny*j+ory*(i+0.25)), (nx*(j-0.5)+orx*(i+0.5), ny*(j-0.5)+ory*(i+0.5))], [(nx*(j-1)+orx*(i+0.75), ny*(j-1)+ory*(i+0.75)), (nx*(j-1)+orx*(i+1), ny*(j-1)+ory*(i+1))]], color=col, **kwds) else: a += line([(nx*j+orx*i, ny*j+ory*i), (nx*j+orx*(i+1), ny*j+ory*(i+1))], color=col, **kwds) a.set_aspect_ratio(aspect_ratio) a.axes(axes) return a
def plot_paths_2d(self, start_sys, end_sys, input_ring, c_skew=.001, endpoints=True, saved_start=None, rand_colors=False): """ This returns a graphics object of solution paths in the complex plane. INPUT: - start_sys -- a square polynomial system, given as a list of polynomials - end_sys -- same type as start_sys - input_ring -- for coercion of the variables into the desired ring. - c_skew -- optional. the imaginary part of homotopy multiplier; nonzero values are often necessary to avoid intermediate path collisions - endpoints -- optional. Whether to draw in the ends of paths as points. - saved_start -- optional. A phc output file. If not given, start system solutions are computed via the phc.blackbox function. OUTPUT: - lines and points of solution paths EXAMPLES:: sage: from sage.interfaces.phc import * sage: from sage.structure.sage_object import SageObject sage: R2.<x,y> = PolynomialRing(QQ,2) sage: start_sys = [x^5-y^2,y^5-1] sage: sol = phc.blackbox(start_sys, R2) # optional -- phc sage: start_save = sol.save_as_start() # optional -- phc sage: end_sys = [x^5-25,y^5-x^2] # optional -- phc sage: testing = phc.plot_paths_2d(start_sys, end_sys, R2) # optional -- phc sage: type(testing) # optional -- phc (normally use plot here) <class 'sage.plot.graphics.Graphics'> """ paths = phc.path_track(start_sys, end_sys, input_ring, c_skew=c_skew, saved_start=saved_start) path_lines = [] sol_pts = [] if rand_colors: r_color = {} for a_var in input_ring.gens(): var_name = str(a_var) r_color[var_name] = (random(), random(), random()) for a_sol in paths: for a_var in input_ring.gens(): var_name = str(a_var) temp_line = [] for data in a_sol: temp_line.append( [data[var_name].real(), data[var_name].imag()]) if rand_colors: path_lines.append( line(temp_line, rgbcolor=r_color[var_name])) else: path_lines.append(line(temp_line)) if endpoints: sol_pts = [] for a_sol in paths: for a_var in input_ring.gens(): var_name = str(a_var) sol_pts.append( point([ a_sol[0][var_name].real(), a_sol[0][var_name].imag() ])) sol_pts.append( point([ a_sol[-1][var_name].real(), a_sol[-1][var_name].imag() ])) return sum(sol_pts) + sum(path_lines) else: return sum(path_lines)