def bar_chart(datalist, **options): """ A bar chart of (currently) one list of numerical data. Support for more data lists in progress. EXAMPLES: A bar_chart with blue bars:: sage: bar_chart([1,2,3,4]) Graphics object consisting of 1 graphics primitive A bar_chart with thinner bars:: sage: bar_chart([x^2 for x in range(1,20)], width=0.2) Graphics object consisting of 1 graphics primitive A bar_chart with negative values and red bars:: sage: bar_chart([-3,5,-6,11], rgbcolor=(1,0,0)) Graphics object consisting of 1 graphics primitive A bar chart with a legend (it's possible, not necessarily useful):: sage: bar_chart([-1,1,-1,1], legend_label='wave') Graphics object consisting of 1 graphics primitive Extra options will get passed on to show(), as long as they are valid:: sage: bar_chart([-2,8,-7,3], rgbcolor=(1,0,0), axes=False) Graphics object consisting of 1 graphics primitive sage: bar_chart([-2,8,-7,3], rgbcolor=(1,0,0)).show(axes=False) # These are equivalent """ dl = len(datalist) #if dl > 1: # print "WARNING, currently only 1 data set allowed" # datalist = datalist[0] if dl == 3: datalist = datalist + [0] #bardata = [] #cnt = 1 #for pnts in datalist: #ind = [i+cnt/dl for i in range(len(pnts))] #bardata.append([ind, pnts, xrange, yrange]) #cnt += 1 g = Graphics() g._set_extra_kwds(Graphics._extract_kwds_for_show(options)) #TODO: improve below for multiple data sets! #cnt = 1 #for ind, pnts, xrange, yrange in bardata: #options={'rgbcolor':hue(cnt/dl),'width':0.5/dl} # g._bar_chart(ind, pnts, xrange, yrange, options=options) # cnt += 1 #else: ind = list(range(len(datalist))) g.add_primitive(BarChart(ind, datalist, options=options)) if options['legend_label']: g.legend(True) return g
def bar_chart(datalist, **options): """ A bar chart of (currently) one list of numerical data. Support for more data lists in progress. EXAMPLES: A bar_chart with blue bars:: sage: bar_chart([1,2,3,4]) Graphics object consisting of 1 graphics primitive A bar_chart with thinner bars:: sage: bar_chart([x^2 for x in range(1,20)], width=0.2) Graphics object consisting of 1 graphics primitive A bar_chart with negative values and red bars:: sage: bar_chart([-3,5,-6,11], rgbcolor=(1,0,0)) Graphics object consisting of 1 graphics primitive A bar chart with a legend (it's possible, not necessarily useful):: sage: bar_chart([-1,1,-1,1], legend_label='wave') Graphics object consisting of 1 graphics primitive Extra options will get passed on to show(), as long as they are valid:: sage: bar_chart([-2,8,-7,3], rgbcolor=(1,0,0), axes=False) Graphics object consisting of 1 graphics primitive sage: bar_chart([-2,8,-7,3], rgbcolor=(1,0,0)).show(axes=False) # These are equivalent """ dl = len(datalist) #if dl > 1: # print "WARNING, currently only 1 data set allowed" # datalist = datalist[0] if dl == 3: datalist = datalist+[0] #bardata = [] #cnt = 1 #for pnts in datalist: #ind = [i+cnt/dl for i in range(len(pnts))] #bardata.append([ind, pnts, xrange, yrange]) #cnt += 1 g = Graphics() g._set_extra_kwds(Graphics._extract_kwds_for_show(options)) #TODO: improve below for multiple data sets! #cnt = 1 #for ind, pnts, xrange, yrange in bardata: #options={'rgbcolor':hue(cnt/dl),'width':0.5/dl} # g._bar_chart(ind, pnts, xrange, yrange, options=options) # cnt += 1 #else: ind = list(range(len(datalist))) g.add_primitive(BarChart(ind, datalist, options=options)) if options['legend_label']: g.legend(True) return g
def legend_3d(hyperplane_arrangement, hyperplane_colors, length): r""" Create plot of a 3d legend for an arrangement of planes in 3-space. The ``length`` parameter determines whether short or long labels are used in the legend. INPUT: - ``hyperplane_arrangement`` -- a hyperplane arrangement - ``hyperplane_colors`` -- list of colors - ``length`` -- either ``'short'`` or ``'long'`` OUTPUT: - A graphics object. EXAMPLES:: sage: a = hyperplane_arrangements.semiorder(3) sage: from sage.geometry.hyperplane_arrangement.plot import legend_3d sage: legend_3d(a, colors.values()[:6],length='long') sage: b = hyperplane_arrangements.semiorder(4) sage: c = b.essentialization() sage: legend_3d(c, colors.values()[:12], length='long') sage: legend_3d(c, colors.values()[:12], length='short') sage: p = legend_3d(c, colors.values()[:12], length='short') sage: p.set_legend_options(ncol=4) sage: type(p) <class 'sage.plot.graphics.Graphics'> """ if hyperplane_arrangement.dimension() != 3: raise ValueError('arrangements must be in 3-space') hyps = hyperplane_arrangement.hyperplanes() N = len(hyperplane_arrangement) if length == 'short': labels = [' ' + str(i) for i in range(N)] else: labels = [ ' ' + hyps[i]._repr_linear(include_zero=False) for i in range(N) ] p = Graphics() for i in range(N): p += line([(0, 0), (0, 0)], color=hyperplane_colors[i], thickness=8, legend_label=labels[i], axes=False) p.set_legend_options(title='Hyperplanes', loc='center', labelspacing=0.4, fancybox=True, font_size='x-large', ncol=2) p.legend(True) return p
def legend_3d(hyperplane_arrangement, hyperplane_colors, length): r""" Create plot of a 3d legend for an arrangement of planes in 3-space. The ``length`` parameter determines whether short or long labels are used in the legend. INPUT: - ``hyperplane_arrangement`` -- a hyperplane arrangement - ``hyperplane_colors`` -- list of colors - ``length`` -- either ``'short'`` or ``'long'`` OUTPUT: - A graphics object. EXAMPLES:: sage: a = hyperplane_arrangements.semiorder(3) sage: from sage.geometry.hyperplane_arrangement.plot import legend_3d sage: legend_3d(a, list(colors.values())[:6],length='long') Graphics object consisting of 6 graphics primitives sage: b = hyperplane_arrangements.semiorder(4) sage: c = b.essentialization() sage: legend_3d(c, list(colors.values())[:12], length='long') Graphics object consisting of 12 graphics primitives sage: legend_3d(c, list(colors.values())[:12], length='short') Graphics object consisting of 12 graphics primitives sage: p = legend_3d(c, list(colors.values())[:12], length='short') sage: p.set_legend_options(ncol=4) sage: type(p) <class 'sage.plot.graphics.Graphics'> """ if hyperplane_arrangement.dimension() != 3: raise ValueError('arrangements must be in 3-space') hyps = hyperplane_arrangement.hyperplanes() N = len(hyperplane_arrangement) if length == 'short': labels = [' ' + str(i) for i in range(N)] else: labels = [' ' + hyps[i]._repr_linear(include_zero=False) for i in range(N)] p = Graphics() for i in range(N): p += line([(0,0),(0,0)], color=hyperplane_colors[i], thickness=8, legend_label=labels[i], axes=False) p.set_legend_options(title='Hyperplanes', loc='center', labelspacing=0.4, fancybox=True, font_size='x-large', ncol=2) p.legend(True) return p
def plot(hyperplane_arrangement, **kwds): r""" Return a plot of the hyperplane arrangement. If the arrangement is in 4 dimensions but inessential, a plot of the essentialization is returned. .. NOTE:: This function is available as the :meth:`~sage.geometry.hyperplane_arrangement.arrangement.HyperplaneArrangementElement.plot` method of hyperplane arrangements. You should not call this function directly, only through the method. INPUT: - ``hyperplane_arrangement`` -- the hyperplane arrangement to plot - ``**kwds`` -- plot options: see :mod:`sage.geometry.hyperplane_arrangement.plot`. OUTPUT: A graphics object of the plot. EXAMPLES:: sage: B = hyperplane_arrangements.semiorder(4) sage: B.plot() Displaying the essentialization. Graphics3d Object """ N = len(hyperplane_arrangement) dim = hyperplane_arrangement.dimension() if hyperplane_arrangement.base_ring().characteristic() != 0: raise NotImplementedError('must be a field of characteristic 0') elif dim == 4: if not hyperplane_arrangement.is_essential(): print('Displaying the essentialization.') hyperplane_arrangement = hyperplane_arrangement.essentialization() elif dim not in [1, 2, 3]: # revise to handle 4d return # silently # handle extra keywords if 'hyperplane_colors' in kwds: hyp_colors = kwds.pop('hyperplane_colors') if not isinstance(hyp_colors, list): # we assume its a single color then hyp_colors = [hyp_colors] * N else: HSV_tuples = [(i * 1.0 / N, 0.8, 0.9) for i in range(N)] hyp_colors = [hsv_to_rgb(*x) for x in HSV_tuples] if 'hyperplane_labels' in kwds: hyp_labels = kwds.pop('hyperplane_labels') has_hyp_label = True if not isinstance(hyp_labels, list): # we assume its a boolean then hyp_labels = [hyp_labels] * N relabeled = [] for i in range(N): if hyp_labels[i] in [True, 'long']: relabeled.append(True) else: relabeled.append(str(i)) hyp_labels = relabeled else: has_hyp_label = False if 'label_colors' in kwds: label_colors = kwds.pop('label_colors') has_label_color = True if not isinstance(label_colors, list): # we assume its a single color then label_colors = [label_colors] * N else: has_label_color = False if 'label_fontsize' in kwds: label_fontsize = kwds.pop('label_fontsize') has_label_fontsize = True if not isinstance(label_fontsize, list): # we assume its a single size then label_fontsize = [label_fontsize] * N else: has_label_fontsize = False if 'label_offsets' in kwds: has_offsets = True offsets = kwds.pop('label_offsets') else: has_offsets = False # give default values below hyperplane_legend = kwds.pop('hyperplane_legend', 'long' if dim < 3 else False) if 'hyperplane_opacities' in kwds: hyperplane_opacities = kwds.pop('hyperplane_opacities') has_opacity = True if not isinstance(hyperplane_opacities, list): # we assume a single number then hyperplane_opacities = [hyperplane_opacities] * N else: has_opacity = False point_sizes = kwds.pop('point_sizes', 50) if not isinstance(point_sizes, list): point_sizes = [point_sizes] * N if 'ranges' in kwds: ranges_set = True ranges = kwds.pop('ranges') if not type(ranges) in [list, tuple]: # ranges is a single number ranges = [ranges] * N # So ranges is some type of list. elif dim == 2: # arrangement of lines in the plane if not type(ranges[0]) in [list, tuple]: # a single interval ranges = [ranges] * N elif dim == 3: # arrangement of planes in 3-space if not type(ranges[0][0]) in [list, tuple]: ranges = [ranges] * N elif dim not in [2, 3]: # ranges is not an option unless dim is 2 or 3 ranges_set = False else: # a list of intervals, one for each hyperplane is given pass # ranges does not need to be modified else: ranges_set = False # give default values below # the extra keywords have now been handled # now handle the legend if dim in [1, 2]: # points on a line or lines in the plane if hyperplane_legend in [True, 'long']: hyps = hyperplane_arrangement.hyperplanes() legend_labels = [hyps[i]._latex_() for i in range(N)] elif hyperplane_legend == 'short': legend_labels = [str(i) for i in range(N)] else: # dim==3, arrangement of planes in 3-space if hyperplane_legend in [True, 'long']: legend3d = legend_3d(hyperplane_arrangement, hyp_colors, 'long') elif hyperplane_legend == 'short': legend3d = legend_3d(hyperplane_arrangement, hyp_colors, 'short') ## done handling the legend ## now create the plot p = Graphics() for i in range(N): newk = copy(kwds) if has_hyp_label: newk['hyperplane_label'] = hyp_labels[i] if has_offsets: if not isinstance(offsets, list): newk['label_offset'] = offsets else: newk['label_offset'] = offsets[i] else: newk['hyperplane_label'] = False if has_label_color: newk['label_color'] = label_colors[i] if has_label_fontsize: newk['label_fontsize'] = label_fontsize[i] if has_opacity: newk['opacity'] = hyperplane_opacities[i] if dim == 1: newk['point_size'] = point_sizes[i] if dim in [1, 2] and hyperplane_legend: # more options than T/F newk['legend_label'] = legend_labels[i] if ranges_set: newk['ranges'] = ranges[i] p += plot_hyperplane(hyperplane_arrangement[i], rgbcolor=hyp_colors[i], **newk) if dim == 1: if hyperplane_legend: # there are more options than T/F p.legend(True) return p elif dim == 2: if hyperplane_legend: # there are more options than T/F p.legend(True) return p else: # dim==3 if hyperplane_legend: # there are more options than T/F return p, legend3d else: return p
def plot(hyperplane_arrangement, **kwds): r""" Return a plot of the hyperplane arrangement. If the arrangement is in 4 dimensions but inessential, a plot of the essentialization is returned. .. NOTE:: This function is available as the :meth:`~sage.geometry.hyperplane_arrangement.arrangement.HyperplaneArrangementElement.plot` method of hyperplane arrangements. You should not call this function directly, only through the method. INPUT: - ``hyperplane_arrangement`` -- the hyperplane arrangement to plot - ``**kwds`` -- plot options: see :mod:`sage.geometry.hyperplane_arrangement.plot`. OUTPUT: A graphics object of the plot. EXAMPLES:: sage: B = hyperplane_arrangements.semiorder(4) sage: B.plot() Displaying the essentialization. Graphics3d Object """ N = len(hyperplane_arrangement) dim = hyperplane_arrangement.dimension() if hyperplane_arrangement.base_ring().characteristic() != 0: raise NotImplementedError('must be a field of characteristic 0') elif dim == 4: if not hyperplane_arrangement.is_essential(): print('Displaying the essentialization.') hyperplane_arrangement = hyperplane_arrangement.essentialization() elif dim not in [1,2,3]: # revise to handle 4d return # silently # handle extra keywords if 'hyperplane_colors' in kwds: hyp_colors = kwds.pop('hyperplane_colors') if not isinstance(hyp_colors, list): # we assume its a single color then hyp_colors = [hyp_colors] * N else: HSV_tuples = [(i*1.0/N, 0.8, 0.9) for i in range(N)] hyp_colors = [hsv_to_rgb(*x) for x in HSV_tuples] if 'hyperplane_labels' in kwds: hyp_labels = kwds.pop('hyperplane_labels') has_hyp_label = True if not isinstance(hyp_labels, list): # we assume its a boolean then hyp_labels = [hyp_labels] * N relabeled = [] for i in range(N): if hyp_labels[i] in [True,'long']: relabeled.append(True) else: relabeled.append(str(i)) hyp_labels = relabeled else: has_hyp_label = False if 'label_colors' in kwds: label_colors = kwds.pop('label_colors') has_label_color = True if not isinstance(label_colors, list): # we assume its a single color then label_colors = [label_colors] * N else: has_label_color = False if 'label_fontsize' in kwds: label_fontsize = kwds.pop('label_fontsize') has_label_fontsize = True if not isinstance(label_fontsize, list): # we assume its a single size then label_fontsize = [label_fontsize] * N else: has_label_fontsize = False if 'label_offsets' in kwds: has_offsets = True offsets = kwds.pop('label_offsets') else: has_offsets = False # give default values below hyperplane_legend = kwds.pop('hyperplane_legend', 'long' if dim < 3 else False) if 'hyperplane_opacities' in kwds: hyperplane_opacities = kwds.pop('hyperplane_opacities') has_opacity = True if not isinstance(hyperplane_opacities, list): # we assume a single number then hyperplane_opacities = [hyperplane_opacities] * N else: has_opacity = False point_sizes = kwds.pop('point_sizes', 50) if not isinstance(point_sizes, list): point_sizes = [point_sizes] * N if 'ranges' in kwds: ranges_set = True ranges = kwds.pop('ranges') if not type(ranges) in [list,tuple]: # ranges is a single number ranges = [ranges] * N # So ranges is some type of list. elif dim == 2: # arrangement of lines in the plane if not type(ranges[0]) in [list,tuple]: # a single interval ranges = [ranges] * N elif dim == 3: # arrangement of planes in 3-space if not type(ranges[0][0]) in [list,tuple]: ranges = [ranges] * N elif dim not in [2,3]: # ranges is not an option unless dim is 2 or 3 ranges_set = False else: # a list of intervals, one for each hyperplane is given pass # ranges does not need to be modified else: ranges_set = False # give default values below # the extra keywords have now been handled # now handle the legend if dim in [1,2]: # points on a line or lines in the plane if hyperplane_legend in [True,'long']: hyps = hyperplane_arrangement.hyperplanes() legend_labels = [hyps[i]._latex_() for i in range(N)] elif hyperplane_legend == 'short' : legend_labels = [str(i) for i in range(N)] else: # dim==3, arrangement of planes in 3-space if hyperplane_legend in [True, 'long']: legend3d = legend_3d(hyperplane_arrangement, hyp_colors, 'long') elif hyperplane_legend == 'short': legend3d = legend_3d(hyperplane_arrangement, hyp_colors, 'short') ## done handling the legend ## now create the plot p = Graphics() for i in range(N): newk = copy(kwds) if has_hyp_label: newk['hyperplane_label'] = hyp_labels[i] if has_offsets: if not isinstance(offsets, list): newk['label_offset'] = offsets else: newk['label_offset'] = offsets[i] else: newk['hyperplane_label'] = False if has_label_color: newk['label_color'] = label_colors[i] if has_label_fontsize: newk['label_fontsize'] = label_fontsize[i] if has_opacity: newk['opacity'] = hyperplane_opacities[i] if dim == 1: newk['point_size'] = point_sizes[i] if dim in [1,2] and hyperplane_legend: # more options than T/F newk['legend_label'] = legend_labels[i] if ranges_set: newk['ranges'] = ranges[i] p += plot_hyperplane(hyperplane_arrangement[i], rgbcolor=hyp_colors[i], **newk) if dim == 1: if hyperplane_legend: # there are more options than T/F p.legend(True) return p elif dim == 2: if hyperplane_legend: # there are more options than T/F p.legend(True) return p else: # dim==3 if hyperplane_legend: # there are more options than T/F return p, legend3d else: return p