コード例 #1
0
ファイル: Legend.py プロジェクト: ptakha/DIRAC-1
    def __init__(self, data=None, axes=None, *aw, **kw):

        self.labels = {}
        if type(data) == types.DictType:
            for label, ddict in data.items():
                #self.labels[label] = pretty_float(max([ float(x) for x in ddict.values() if x ]) )
                self.labels[label] = "%.1f" % max(
                    [float(x) for x in ddict.values() if x])
        elif type(data) == types.InstanceType and data.__class__ == GraphData:
            self.labels = data.getLabels()
        else:
            self.labels = data
        #self.labels.reverse()
        self.ax = axes
        self.canvas = None
        if self.ax:
            self.canvas = self.ax.figure.canvas
            self.ax.set_axis_off()
        self.prefs = evalPrefs(*aw, **kw)
        self.palette = Palette()

        if self.labels and self.labels[0][0] != 'NoLabels':
            percent_flag = self.prefs.get('legend_unit', '')
            if percent_flag == "%":
                sum_value = sum(data.label_values)
                if sum_value > 0.:
                    self.labels = [(l, v / sum_value * 100.)
                                   for l, v in self.labels]
        self.__get_column_width()
コード例 #2
0
    def __init__(self, data=None, axes=None, *aw, **kw):

        self.text_size = 0
        self.column_width = 0
        self.labels = {}
        if isinstance(data, dict):
            for label, ddict in data.items():
                # self.labels[label] = pretty_float(max([ float(x) for x in ddict.values() if x ]) )
                self.labels[label] = "%.1f" % max(
                    [float(x) for x in ddict.values() if x])
        elif isinstance(data, GraphData):
            self.labels = data.getLabels()
        else:
            self.labels = data
        # self.labels.reverse()
        self.ax = axes
        self.canvas = None
        if self.ax:
            self.canvas = self.ax.figure.canvas
            self.ax.set_axis_off()
        self.prefs = evalPrefs(*aw, **kw)
        self.palette = Palette()

        if self.labels and self.labels[0][0] != "NoLabels":
            percent_flag = self.prefs.get("legend_unit", "")
            if percent_flag == "%":
                sum_value = sum(data.label_values)
                if sum_value > 0.0:
                    self.labels = [(l, v / sum_value * 100.0)
                                   for l, v in self.labels]
        self.__get_column_width()
コード例 #3
0
ファイル: Legend.py プロジェクト: DIRACGrid-test/DIRAC
  def __init__(self,data=None,axes=None,*aw,**kw): 

    self.labels = {}
    if type(data) == types.DictType:
      for label,ddict in data.items():
        #self.labels[label] = pretty_float(max([ float(x) for x in ddict.values() if x ]) )  
        self.labels[label] = "%.1f" % max([ float(x) for x in ddict.values() if x ])   
    elif type(data) == types.InstanceType and data.__class__ == GraphData:
      self.labels = data.getLabels()    
    else:
      self.labels = data  
    #self.labels.reverse()  
    self.ax = axes
    self.canvas = None
    if self.ax:
      self.canvas = self.ax.figure.canvas
      self.ax.set_axis_off()
    self.prefs = evalPrefs(*aw,**kw)
    self.palette = Palette()
        
    if self.labels and self.labels[0][0] != 'NoLabels':
      percent_flag = self.prefs.get('legend_unit','')
      if percent_flag == "%":       
        sum_value = sum(data.label_values)
        if sum_value > 0.:
          self.labels = [(l,v/sum_value*100.) for l,v in self.labels ]
    self.__get_column_width()
コード例 #4
0
    def __init__(self, data=None, axes=None, *aw, **kw):

        self.ax_contain = axes
        self.canvas = None
        self.figure = None
        if self.ax_contain:
            self.figure = self.ax_contain.get_figure()
            self.canvas = self.figure.canvas
            self.dpi = self.ax_contain.figure.get_dpi()
            self.ax_contain.set_axis_off()
        self.prefs = evalPrefs(*aw, **kw)
        self.coords = {}
        self.palette = Palette()
        if isinstance(data, dict):
            self.gdata = GraphData(data)
        elif isinstance(data, object) and data.__class__ == GraphData:
            self.gdata = data
コード例 #5
0
ファイル: PlotBase.py プロジェクト: DIRACGrid-test/DIRAC
  def __init__( self, data = None, axes = None, *aw, **kw ):

    self.ax_contain = axes
    self.canvas = None
    self.figure = None
    if self.ax_contain:
      self.figure = self.ax_contain.get_figure()
      self.canvas = self.figure.canvas
      self.dpi = self.ax_contain.figure.get_dpi()
      self.ax_contain.set_axis_off()
    self.prefs = evalPrefs( *aw, **kw )
    self.coords = {}
    self.palette = Palette()
    if isinstance( data, dict):
      self.gdata = GraphData( data )
    elif isinstance( data, object) and data.__class__ == GraphData:
      self.gdata = data
コード例 #6
0
ファイル: Legend.py プロジェクト: DIRACGrid-test/DIRAC
class Legend:

  def __init__(self,data=None,axes=None,*aw,**kw): 

    self.labels = {}
    if type(data) == types.DictType:
      for label,ddict in data.items():
        #self.labels[label] = pretty_float(max([ float(x) for x in ddict.values() if x ]) )  
        self.labels[label] = "%.1f" % max([ float(x) for x in ddict.values() if x ])   
    elif type(data) == types.InstanceType and data.__class__ == GraphData:
      self.labels = data.getLabels()    
    else:
      self.labels = data  
    #self.labels.reverse()  
    self.ax = axes
    self.canvas = None
    if self.ax:
      self.canvas = self.ax.figure.canvas
      self.ax.set_axis_off()
    self.prefs = evalPrefs(*aw,**kw)
    self.palette = Palette()
        
    if self.labels and self.labels[0][0] != 'NoLabels':
      percent_flag = self.prefs.get('legend_unit','')
      if percent_flag == "%":       
        sum_value = sum(data.label_values)
        if sum_value > 0.:
          self.labels = [(l,v/sum_value*100.) for l,v in self.labels ]
    self.__get_column_width()
    
  def dumpPrefs(self):
  
    for key in self.prefs:
      print key.rjust(20),':',str(self.prefs[key]).ljust(40)
      
  def setLabels(self,labels):
  
    self.labels = labels   
    
  def setAxes(self,axes):
  
    self.ax = axes  
    self.canvas = self.ax.figure.canvas
    self.ax.set_axis_off() 
    
  def getLegendSize(self):
    self.__get_column_width()
    legend_position = self.prefs['legend_position']
    legend_width = float(self.prefs['legend_width']) 
    legend_height = float(self.prefs['legend_height']) 
    legend_padding = float(self.prefs['legend_padding'])   
    legend_text_size = self.prefs.get('legend_text_size',self.prefs['text_size'])
    legend_text_padding = self.prefs.get('legend_text_padding',self.prefs['text_padding'])
    if legend_position in ['right','left']:
      # One column in case of vertical legend
      legend_width = self.column_width+legend_padding
      nLabels = len(self.labels)
      legend_max_height = nLabels*(legend_text_size+legend_text_padding)
    elif legend_position == 'bottom':
      nColumns = min(self.prefs['legend_max_columns'],int(legend_width/self.column_width))
      nLabels = len(self.labels)
      maxRows = self.prefs['legend_max_rows']
      nRows_ax = int(legend_height/1.6/self.prefs['text_size'])
      nRows_label = nLabels/nColumns + (nLabels%nColumns != 0)
      nRows = max(1,min(min(nRows_label,maxRows),nRows_ax ))
      text_padding = self.prefs['text_padding']    
      text_padding = pixelToPoint(text_padding,self.prefs['dpi'])    
      legend_height = min(legend_height,(nRows*(self.text_size+text_padding)+text_padding))
      legend_max_height = nLabels*(self.text_size+text_padding)
      
    return legend_width,legend_height,legend_max_height  
  
  def __get_legend_text_size(self):
    
    dpi = self.prefs['dpi']
    text_size = self.prefs['text_size']
    text_padding = self.prefs['text_padding']
    legend_text_size = self.prefs.get('legend_text_size',text_size)
    legend_text_padding = self.prefs.get('legend_text_padding',text_padding)
    return legend_text_size,legend_text_padding

  def __get_column_width(self):
  
    max_length = 0
    max_column_text = ''
    flag = self.prefs.get('legend_numbers',True)
    unit = self.prefs.get('legend_unit',False)
    for label,num in self.labels:      
      if not flag: num = None
      if num is not None:
        column_length = len(str(label)+str(num)) + 1
      else:
        column_length = len(str(label)) + 1  
      if column_length > max_length:
        max_length = column_length
        if flag:
          if type(num) == types.IntType or type(num) == types.LongType:
            numString = str(num)
          else:
            numString = "%.1f" % float(num)  
          max_column_text = '%s  %s' % (str(label),numString)
          if unit:
            max_column_text += "%"
        else:
          max_column_text = '%s   ' % str(label)  
                         
    figure = Figure()   
    canvas = FigureCanvasAgg(figure) 
    dpi = self.prefs['dpi']
    figure.set_dpi( dpi ) 
    l_size,l_padding = self.__get_legend_text_size()    
    self.text_size = pixelToPoint(l_size,dpi)           
    text = Text(0.,0.,text=max_column_text,size=self.text_size)
    text.set_figure(figure)
    bbox = text.get_window_extent(canvas.get_renderer())
    self.column_width = bbox.width+6*l_size
        
  def draw(self):
  
    dpi = self.prefs['dpi']
    ax_xsize = self.ax.get_window_extent().width
    ax_ysize = self.ax.get_window_extent().height  
    nLabels = len(self.labels)
    nColumns = min(self.prefs['legend_max_columns'],int(ax_xsize/self.column_width))
    
    maxRows = self.prefs['legend_max_rows']
    nRows_ax = int(ax_ysize/1.6/self.prefs['text_size'])
    nRows_label = nLabels/nColumns + (nLabels%nColumns != 0)
    nRows = max(1,min(min(nRows_label,maxRows),nRows_ax ))
    maxLabels = nColumns*nRows - 1
    self.ax.set_xlim(0.,float(ax_xsize))
    self.ax.set_ylim(-float(ax_ysize),0.)
   
    legend_text_size,legend_text_padding = self.__get_legend_text_size()
    legend_text_size_point = pixelToPoint(legend_text_size,dpi)
        
    box_width = legend_text_size
    legend_offset = (ax_xsize - nColumns*self.column_width)/2 
    
    nc = 0
    #self.labels.reverse()
    
    for label,num in self.labels:
      num_flag = self.prefs.get('legend_numbers',True)
      percent_flag = self.prefs.get('legend_unit','')
      if num_flag:
        if percent_flag == "%":
          num = "%.1f" % num +'%'
        else:  
          num = "%.1f" % num
      else:
        num = None  
      color = self.palette.getColor(label)
      row = nc%nRows 
      column = nc/nRows          
      if row == nRows-1 and column == nColumns-1 and nc != nLabels-1:
        last_text = '... plus %d more' % (nLabels-nc)
        self.ax.text(float(column*self.column_width)+legend_offset,-float(row*1.6*box_width),
                     last_text,horizontalalignment='left',
                     verticalalignment='top',size=legend_text_size_point)  
        break   
      else:
        self.ax.text(float(column*self.column_width)+2.*box_width+legend_offset,-row*1.6*box_width,
                     str(label),horizontalalignment='left',
                     verticalalignment='top',size=legend_text_size_point)
        if num is not None:
          self.ax.text(float((column+1)*self.column_width)-2*box_width+legend_offset,-float(row*1.6*box_width),
                       str(num),horizontalalignment='right',
                       verticalalignment='top',size=legend_text_size_point)             
        box = Rectangle((float(column*self.column_width)+legend_offset,-float(row*1.6*box_width)-box_width),
                        box_width,box_width)            
        box.set_ec('black')
        box.set_linewidth(pixelToPoint(0.5,dpi))
        box.set_fc(color)
        self.ax.add_patch(box)
        nc += 1    
コード例 #7
0
class PlotBase(object):
    def __init__(self, data=None, axes=None, *aw, **kw):

        self.ax_contain = axes
        self.canvas = None
        self.figure = None
        if self.ax_contain:
            self.figure = self.ax_contain.get_figure()
            self.canvas = self.figure.canvas
            self.dpi = self.ax_contain.figure.get_dpi()
            self.ax_contain.set_axis_off()
        self.prefs = evalPrefs(*aw, **kw)
        self.coords = {}
        self.palette = Palette()
        if isinstance(data, dict):
            self.gdata = GraphData(data)
        elif isinstance(data, object) and data.__class__ == GraphData:
            self.gdata = data

    def dumpPrefs(self):

        for key in self.prefs:
            print(key.rjust(20), ':', str(self.prefs[key]).ljust(40))

    def setAxes(self, axes):

        self.ax_contain = axes
        self.ax_contain.set_axis_off()
        self.figure = self.ax_contain.get_figure()
        self.canvas = self.figure.canvas
        self.dpi = self.ax_contain.figure.get_dpi()

    def draw(self):

        prefs = self.prefs
        dpi = self.ax_contain.figure.get_dpi()

        # Update palette
        palette = prefs.get('colors', {})
        if palette:
            self.palette.addPalette(palette)

        xlabel = prefs.get('xlabel', '')
        ylabel = prefs.get('ylabel', '')
        xticks_flag = prefs.get('xticks', True)
        yticks_flag = prefs.get('yticks', True)

        text_size = prefs['text_size']
        text_padding = prefs['text_padding']

        label_text_size = prefs.get('label_text_size', text_size)
        label_text_size_point = pixelToPoint(label_text_size, dpi)
        tick_text_size = prefs.get('tick_text_size', text_size)
        tick_text_size_point = pixelToPoint(tick_text_size, dpi)

        ytick_length = prefs.get('ytick_length', 7 * tick_text_size)

        plot_title = prefs.get('plot_title', '')
        if not plot_title or plot_title == 'NoTitle':
            plot_title_size = 0
            plot_title_padding = 0
        else:
            plot_title_size = prefs.get('plot_title_size', text_size)
            plot_title_padding = prefs.get('plot_text_padding', text_padding)
        plot_title_size_point = pixelToPoint(plot_title_size, dpi)

        stats_flag = prefs.get('statistics_line', False)
        stats_line = ''
        stats_line_space = 0.
        if stats_flag:
            stats_line = self.gdata.getStatString()
            stats_line_size = label_text_size
            stats_line_padding = label_text_size * 2.
            stats_line_space = stats_line_size + stats_line_padding

        plot_padding = prefs['plot_padding']
        plot_left_padding = prefs.get('plot_left_padding', plot_padding)
        plot_right_padding = prefs.get('plot_right_padding', 0)
        plot_bottom_padding = prefs.get('plot_bottom_padding', plot_padding)
        plot_top_padding = prefs.get('plot_top_padding', 0)
        frame_flag = prefs['frame']

        # Create plot axes, and set properties
        left, bottom, width, height = self.ax_contain.get_window_extent(
        ).bounds
        l, b, f_width, f_height = self.figure.get_window_extent().bounds

        # Space needed for labels and ticks
        x_label_space = 0
        if xticks_flag:
            x_label_space += tick_text_size * 1.5
        if xlabel:
            x_label_space += label_text_size * 1.5
        y_label_space = 0
        if yticks_flag:
            y_label_space += ytick_length
        if ylabel:
            y_label_space += label_text_size * 1.5

        ax_plot_rect = ( float( plot_left_padding + left + y_label_space ) / f_width,
                         float( plot_bottom_padding + bottom + x_label_space + stats_line_space ) / f_height,
                         float( width - plot_left_padding - plot_right_padding - y_label_space ) / f_width,
                         float( height - plot_bottom_padding - plot_top_padding - x_label_space - \
                                plot_title_size - 2 * plot_title_padding - stats_line_space ) / f_height )
        ax = Axes(self.figure, ax_plot_rect)
        if prefs['square_axis']:
            l, b, a_width, a_height = ax.get_window_extent().bounds
            delta = abs(a_height - a_width)
            if a_height > a_width:
                a_height = a_width
                ax_plot_rect = (
                    float(plot_left_padding + left) / f_width,
                    float(plot_bottom_padding + bottom + delta / 2.) /
                    f_height,
                    float(width - plot_left_padding - plot_right_padding) /
                    f_width,
                    float(height - plot_bottom_padding - plot_title_size -
                          2 * plot_title_padding - delta) / f_height)
            else:
                a_width = a_height
                ax_plot_rect = (
                    float(plot_left_padding + left + delta / 2.) / f_width,
                    float(plot_bottom_padding + bottom) / f_height,
                    float(width - plot_left_padding - delta) / f_width,
                    float(height - plot_bottom_padding - plot_title_size -
                          2 * plot_title_padding) / f_height)
            ax.set_position(ax_plot_rect)

        self.figure.add_axes(ax)
        self.ax = ax
        frame = ax.patch
        frame.set_fill(False)

        if frame_flag.lower() == 'off':
            self.ax.set_axis_off()
            self.log_xaxis = False
            self.log_yaxis = False
        else:
            # If requested, make x/y axis logarithmic
            if prefs.get('log_xaxis', 'False').find('r') >= 0:
                ax.semilogx()
                self.log_xaxis = True
            else:
                self.log_xaxis = False
            if prefs.get('log_yaxis', 'False').find('r') >= 0:
                ax.semilogy()
                self.log_yaxis = True
            else:
                self.log_yaxis = False

            if xticks_flag:
                setp(ax.get_xticklabels(), family=prefs['font_family'])
                setp(ax.get_xticklabels(), fontname=prefs['font'])
                setp(ax.get_xticklabels(), size=tick_text_size_point)
            else:
                setp(ax.get_xticklabels(), size=0)

            if yticks_flag:
                setp(ax.get_yticklabels(), family=prefs['font_family'])
                setp(ax.get_yticklabels(), fontname=prefs['font'])
                setp(ax.get_yticklabels(), size=tick_text_size_point)
            else:
                setp(ax.get_yticklabels(), size=0)

            setp(ax.get_xticklines(), markeredgewidth=pixelToPoint(0.5, dpi))
            setp(ax.get_xticklines(),
                 markersize=pixelToPoint(text_size / 2., dpi))
            setp(ax.get_yticklines(), markeredgewidth=pixelToPoint(0.5, dpi))
            setp(ax.get_yticklines(),
                 markersize=pixelToPoint(text_size / 2., dpi))
            setp(ax.get_xticklines(), zorder=4.0)

            line_width = prefs.get('line_width', 1.0)
            frame_line_width = prefs.get('frame_line_width', line_width)
            grid_line_width = prefs.get('grid_line_width', 0.1)
            plot_line_width = prefs.get('plot_line_width', 0.1)

            setp(ax.patch, linewidth=pixelToPoint(plot_line_width, dpi))
            #setp( ax.spines, linewidth=pixelToPoint(frame_line_width,dpi) )
            #setp( ax.axvline(), linewidth=pixelToPoint(1.0,dpi) )
            axis_grid_flag = prefs.get('plot_axis_grid', True)
            if axis_grid_flag:
                ax.grid(True,
                        color='#555555',
                        linewidth=pixelToPoint(grid_line_width, dpi))

            plot_axis_flag = prefs.get('plot_axis', True)
            if plot_axis_flag:
                # Set labels
                if xlabel:
                    t = ax.set_xlabel(xlabel)
                    t.set_family(prefs['font_family'])
                    t.set_fontname(prefs['font'])
                    t.set_size(label_text_size)

                if ylabel:
                    t = ax.set_ylabel(ylabel)
                    t.set_family(prefs['font_family'])
                    t.set_fontname(prefs['font'])
                    t.set_size(label_text_size)
            else:
                self.ax.set_axis_off()

        # Create a plot title, if necessary
        if plot_title:
            self.ax.title = self.ax.text(
                0.5,
                1. + float(plot_title_padding) / height,
                plot_title,
                verticalalignment='bottom',
                horizontalalignment='center',
                size=pixelToPoint(plot_title_size, dpi),
                family=prefs['font_family'],
                fontname=prefs['font'])
            self.ax.title.set_transform(self.ax.transAxes)
            self.ax.title.set_family(prefs['font_family'])
            self.ax.title.set_fontname(prefs['font'])
        if stats_line:
            self.ax.stats = self.ax.text(0.5, (-stats_line_space) / height,
                                         stats_line,
                                         verticalalignment='top',
                                         horizontalalignment='center',
                                         size=pixelToPoint(
                                             stats_line_size, dpi))

            self.ax.stats.set_transform(self.ax.transAxes)
コード例 #8
0
ファイル: PlotBase.py プロジェクト: DIRACGrid-test/DIRAC
class PlotBase( object ):

  def __init__( self, data = None, axes = None, *aw, **kw ):

    self.ax_contain = axes
    self.canvas = None
    self.figure = None
    if self.ax_contain:
      self.figure = self.ax_contain.get_figure()
      self.canvas = self.figure.canvas
      self.dpi = self.ax_contain.figure.get_dpi()
      self.ax_contain.set_axis_off()
    self.prefs = evalPrefs( *aw, **kw )
    self.coords = {}
    self.palette = Palette()
    if isinstance( data, dict):
      self.gdata = GraphData( data )
    elif isinstance( data, object) and data.__class__ == GraphData:
      self.gdata = data

  def dumpPrefs( self ):

    for key in self.prefs:
      print key.rjust( 20 ), ':', str( self.prefs[key] ).ljust( 40 )

  def setAxes( self, axes ):

    self.ax_contain = axes
    self.ax_contain.set_axis_off()
    self.figure = self.ax_contain.get_figure()
    self.canvas = self.figure.canvas
    self.dpi = self.ax_contain.figure.get_dpi()

  def draw( self ):

    prefs = self.prefs
    dpi = self.ax_contain.figure.get_dpi()

    # Update palette
    palette = prefs.get( 'colors', {} )
    if palette:
      self.palette.addPalette( palette )


    xlabel = prefs.get( 'xlabel', '' )
    ylabel = prefs.get( 'ylabel', '' )
    xticks_flag = prefs.get( 'xticks', True )
    yticks_flag = prefs.get( 'yticks', True )

    text_size = prefs['text_size']
    text_padding = prefs['text_padding']

    label_text_size = prefs.get( 'label_text_size', text_size )
    label_text_size_point = pixelToPoint( label_text_size, dpi )
    tick_text_size = prefs.get( 'tick_text_size', text_size )
    tick_text_size_point = pixelToPoint( tick_text_size, dpi )

    ytick_length = prefs.get( 'ytick_length', 7 * tick_text_size )

    plot_title = prefs.get( 'plot_title', '' )
    if not plot_title or plot_title == 'NoTitle':
      plot_title_size = 0
      plot_title_padding = 0
    else:
      plot_title_size = prefs.get( 'plot_title_size', text_size )
      plot_title_padding = prefs.get( 'plot_text_padding', text_padding )
    plot_title_size_point = pixelToPoint( plot_title_size, dpi )

    stats_flag = prefs.get( 'statistics_line', False )
    stats_line = ''
    stats_line_space = 0.
    if stats_flag:
      stats_line = self.gdata.getStatString()
      stats_line_size = label_text_size
      stats_line_padding = label_text_size * 2.
      stats_line_space = stats_line_size + stats_line_padding

    plot_padding = prefs['plot_padding']
    plot_left_padding = prefs.get( 'plot_left_padding', plot_padding )
    plot_right_padding = prefs.get( 'plot_right_padding', 0 )
    plot_bottom_padding = prefs.get( 'plot_bottom_padding', plot_padding )
    plot_top_padding = prefs.get( 'plot_top_padding', 0 )
    frame_flag = prefs['frame']

    # Create plot axes, and set properties
    left, bottom, width, height = self.ax_contain.get_window_extent().bounds
    l, b, f_width, f_height = self.figure.get_window_extent().bounds

    # Space needed for labels and ticks
    x_label_space = 0
    if xticks_flag:
      x_label_space += tick_text_size * 1.5
    if xlabel:
      x_label_space += label_text_size * 1.5
    y_label_space = 0
    if yticks_flag:
      y_label_space += ytick_length
    if ylabel:
      y_label_space += label_text_size * 1.5

    ax_plot_rect = ( float( plot_left_padding + left + y_label_space ) / f_width,
                     float( plot_bottom_padding + bottom + x_label_space + stats_line_space ) / f_height,
                     float( width - plot_left_padding - plot_right_padding - y_label_space ) / f_width,
                     float( height - plot_bottom_padding - plot_top_padding - x_label_space - \
                            plot_title_size - 2 * plot_title_padding - stats_line_space ) / f_height )
    ax = Axes( self.figure, ax_plot_rect )
    if prefs['square_axis']:
      l, b, a_width, a_height = ax.get_window_extent().bounds
      delta = abs( a_height - a_width )
      if a_height > a_width:
        a_height = a_width
        ax_plot_rect = ( float( plot_left_padding + left ) / f_width,
                         float( plot_bottom_padding + bottom + delta / 2. ) / f_height,
                         float( width - plot_left_padding - plot_right_padding ) / f_width,
                         float( height - plot_bottom_padding - plot_title_size - 2 * plot_title_padding - delta ) / f_height )
      else:
        a_width = a_height
        ax_plot_rect = ( float( plot_left_padding + left + delta / 2. ) / f_width,
                         float( plot_bottom_padding + bottom ) / f_height,
                         float( width - plot_left_padding - delta ) / f_width,
                         float( height - plot_bottom_padding - plot_title_size - 2 * plot_title_padding ) / f_height )
      ax.set_position( ax_plot_rect )


    self.figure.add_axes( ax )
    self.ax = ax
    frame = ax.patch
    frame.set_fill( False )

    if frame_flag.lower() == 'off':
      self.ax.set_axis_off()
      self.log_xaxis = False
      self.log_yaxis = False
    else:
      # If requested, make x/y axis logarithmic
      if prefs.get( 'log_xaxis', 'False' ).find( 'r' ) >= 0:
        ax.semilogx()
        self.log_xaxis = True
      else:
        self.log_xaxis = False
      if prefs.get( 'log_yaxis', 'False' ).find( 'r' ) >= 0:
        ax.semilogy()
        self.log_yaxis = True
      else:
        self.log_yaxis = False

      if xticks_flag:
        setp( ax.get_xticklabels(), family = prefs['font_family'] )
        setp( ax.get_xticklabels(), fontname = prefs['font'] )
        setp( ax.get_xticklabels(), size = tick_text_size_point )
      else:
        setp( ax.get_xticklabels(), size = 0 )

      if yticks_flag:
        setp( ax.get_yticklabels(), family = prefs['font_family'] )
        setp( ax.get_yticklabels(), fontname = prefs['font'] )
        setp( ax.get_yticklabels(), size = tick_text_size_point )
      else:
        setp( ax.get_yticklabels(), size = 0 )

      setp( ax.get_xticklines(), markeredgewidth = pixelToPoint( 0.5, dpi ) )
      setp( ax.get_xticklines(), markersize = pixelToPoint( text_size / 2., dpi ) )
      setp( ax.get_yticklines(), markeredgewidth = pixelToPoint( 0.5, dpi ) )
      setp( ax.get_yticklines(), markersize = pixelToPoint( text_size / 2., dpi ) )
      setp( ax.get_xticklines(), zorder = 4.0 )

      line_width = prefs.get( 'line_width', 1.0 )
      frame_line_width = prefs.get( 'frame_line_width', line_width )
      grid_line_width = prefs.get( 'grid_line_width', 0.1 )
      plot_line_width = prefs.get( 'plot_line_width', 0.1 )

      setp( ax.patch, linewidth = pixelToPoint( plot_line_width, dpi ) )
      #setp( ax.spines, linewidth=pixelToPoint(frame_line_width,dpi) )
      #setp( ax.axvline(), linewidth=pixelToPoint(1.0,dpi) )
      axis_grid_flag = prefs.get( 'plot_axis_grid', True )
      if axis_grid_flag:
        ax.grid( True, color = '#555555', linewidth = pixelToPoint( grid_line_width, dpi ) )

      plot_axis_flag = prefs.get( 'plot_axis', True )
      if plot_axis_flag:
      # Set labels
        if xlabel:
          t = ax.set_xlabel( xlabel )
          t.set_family( prefs['font_family'] )
          t.set_fontname( prefs['font'] )
          t.set_size( label_text_size )

        if ylabel:
          t = ax.set_ylabel( ylabel )
          t.set_family( prefs['font_family'] )
          t.set_fontname( prefs['font'] )
          t.set_size( label_text_size )
      else:
        self.ax.set_axis_off()


    # Create a plot title, if necessary
    if plot_title:
      self.ax.title = self.ax.text( 0.5,
                                    1. + float( plot_title_padding ) / height,
                                    plot_title,
                                    verticalalignment = 'bottom',
                                    horizontalalignment = 'center',
                                    size = pixelToPoint( plot_title_size, dpi ),
                                    family = prefs['font_family'],
                                    fontname = prefs['font'])
      self.ax.title.set_transform( self.ax.transAxes )
      self.ax.title.set_family( prefs['font_family'] )
      self.ax.title.set_fontname( prefs['font'] )
    if stats_line:
      self.ax.stats = self.ax.text( 0.5, ( -stats_line_space ) / height,
                                    stats_line,
                                    verticalalignment = 'top',
                                    horizontalalignment = 'center',
                                    size = pixelToPoint( stats_line_size, dpi ) )

      self.ax.stats.set_transform( self.ax.transAxes )
コード例 #9
0
ファイル: Legend.py プロジェクト: ptakha/DIRAC-1
class Legend:
    def __init__(self, data=None, axes=None, *aw, **kw):

        self.labels = {}
        if type(data) == types.DictType:
            for label, ddict in data.items():
                #self.labels[label] = pretty_float(max([ float(x) for x in ddict.values() if x ]) )
                self.labels[label] = "%.1f" % max(
                    [float(x) for x in ddict.values() if x])
        elif type(data) == types.InstanceType and data.__class__ == GraphData:
            self.labels = data.getLabels()
        else:
            self.labels = data
        #self.labels.reverse()
        self.ax = axes
        self.canvas = None
        if self.ax:
            self.canvas = self.ax.figure.canvas
            self.ax.set_axis_off()
        self.prefs = evalPrefs(*aw, **kw)
        self.palette = Palette()

        if self.labels and self.labels[0][0] != 'NoLabels':
            percent_flag = self.prefs.get('legend_unit', '')
            if percent_flag == "%":
                sum_value = sum(data.label_values)
                if sum_value > 0.:
                    self.labels = [(l, v / sum_value * 100.)
                                   for l, v in self.labels]
        self.__get_column_width()

    def dumpPrefs(self):

        for key in self.prefs:
            print key.rjust(20), ':', str(self.prefs[key]).ljust(40)

    def setLabels(self, labels):

        self.labels = labels

    def setAxes(self, axes):

        self.ax = axes
        self.canvas = self.ax.figure.canvas
        self.ax.set_axis_off()

    def getLegendSize(self):
        self.__get_column_width()
        legend_position = self.prefs['legend_position']
        legend_width = float(self.prefs['legend_width'])
        legend_height = float(self.prefs['legend_height'])
        legend_padding = float(self.prefs['legend_padding'])
        legend_text_size = self.prefs.get('legend_text_size',
                                          self.prefs['text_size'])
        legend_text_padding = self.prefs.get('legend_text_padding',
                                             self.prefs['text_padding'])
        if legend_position in ['right', 'left']:
            # One column in case of vertical legend
            legend_width = self.column_width + legend_padding
            nLabels = len(self.labels)
            legend_max_height = nLabels * (legend_text_size +
                                           legend_text_padding)
        elif legend_position == 'bottom':
            nColumns = min(self.prefs['legend_max_columns'],
                           int(legend_width / self.column_width))
            nLabels = len(self.labels)
            maxRows = self.prefs['legend_max_rows']
            nRows_ax = int(legend_height / 1.6 / self.prefs['text_size'])
            nRows_label = nLabels / nColumns + (nLabels % nColumns != 0)
            nRows = max(1, min(min(nRows_label, maxRows), nRows_ax))
            text_padding = self.prefs['text_padding']
            text_padding = pixelToPoint(text_padding, self.prefs['dpi'])
            legend_height = min(
                legend_height,
                (nRows * (self.text_size + text_padding) + text_padding))
            legend_max_height = nLabels * (self.text_size + text_padding)

        return legend_width, legend_height, legend_max_height

    def __get_legend_text_size(self):

        dpi = self.prefs['dpi']
        text_size = self.prefs['text_size']
        text_padding = self.prefs['text_padding']
        legend_text_size = self.prefs.get('legend_text_size', text_size)
        legend_text_padding = self.prefs.get('legend_text_padding',
                                             text_padding)
        return legend_text_size, legend_text_padding

    def __get_column_width(self):

        max_length = 0
        max_column_text = ''
        flag = self.prefs.get('legend_numbers', True)
        unit = self.prefs.get('legend_unit', False)
        for label, num in self.labels:
            if not flag: num = None
            if num is not None:
                column_length = len(str(label) + str(num)) + 1
            else:
                column_length = len(str(label)) + 1
            if column_length > max_length:
                max_length = column_length
                if flag:
                    if type(num) == types.IntType or type(
                            num) == types.LongType:
                        numString = str(num)
                    else:
                        numString = "%.1f" % float(num)
                    max_column_text = '%s  %s' % (str(label), numString)
                    if unit:
                        max_column_text += "%"
                else:
                    max_column_text = '%s   ' % str(label)

        figure = Figure()
        canvas = FigureCanvasAgg(figure)
        dpi = self.prefs['dpi']
        figure.set_dpi(dpi)
        l_size, l_padding = self.__get_legend_text_size()
        self.text_size = pixelToPoint(l_size, dpi)
        text = Text(0., 0., text=max_column_text, size=self.text_size)
        text.set_figure(figure)
        bbox = text.get_window_extent(canvas.get_renderer())
        self.column_width = bbox.width + 6 * l_size

    def draw(self):

        dpi = self.prefs['dpi']
        ax_xsize = self.ax.get_window_extent().width
        ax_ysize = self.ax.get_window_extent().height
        nLabels = len(self.labels)
        nColumns = min(self.prefs['legend_max_columns'],
                       int(ax_xsize / self.column_width))

        maxRows = self.prefs['legend_max_rows']
        nRows_ax = int(ax_ysize / 1.6 / self.prefs['text_size'])
        nRows_label = nLabels / nColumns + (nLabels % nColumns != 0)
        nRows = max(1, min(min(nRows_label, maxRows), nRows_ax))
        maxLabels = nColumns * nRows - 1
        self.ax.set_xlim(0., float(ax_xsize))
        self.ax.set_ylim(-float(ax_ysize), 0.)

        legend_text_size, legend_text_padding = self.__get_legend_text_size()
        legend_text_size_point = pixelToPoint(legend_text_size, dpi)

        box_width = legend_text_size
        legend_offset = (ax_xsize - nColumns * self.column_width) / 2

        nc = 0
        #self.labels.reverse()

        for label, num in self.labels:
            num_flag = self.prefs.get('legend_numbers', True)
            percent_flag = self.prefs.get('legend_unit', '')
            if num_flag:
                if percent_flag == "%":
                    num = "%.1f" % num + '%'
                else:
                    num = "%.1f" % num
            else:
                num = None
            color = self.palette.getColor(label)
            row = nc % nRows
            column = nc / nRows
            if row == nRows - 1 and column == nColumns - 1 and nc != nLabels - 1:
                last_text = '... plus %d more' % (nLabels - nc)
                self.ax.text(float(column * self.column_width) + legend_offset,
                             -float(row * 1.6 * box_width),
                             last_text,
                             horizontalalignment='left',
                             verticalalignment='top',
                             size=legend_text_size_point)
                break
            else:
                self.ax.text(float(column * self.column_width) +
                             2. * box_width + legend_offset,
                             -row * 1.6 * box_width,
                             str(label),
                             horizontalalignment='left',
                             verticalalignment='top',
                             size=legend_text_size_point)
                if num is not None:
                    self.ax.text(float((column + 1) * self.column_width) -
                                 2 * box_width + legend_offset,
                                 -float(row * 1.6 * box_width),
                                 str(num),
                                 horizontalalignment='right',
                                 verticalalignment='top',
                                 size=legend_text_size_point)
                box = Rectangle(
                    (float(column * self.column_width) + legend_offset,
                     -float(row * 1.6 * box_width) - box_width), box_width,
                    box_width)
                box.set_ec('black')
                box.set_linewidth(pixelToPoint(0.5, dpi))
                box.set_fc(color)
                self.ax.add_patch(box)
                nc += 1
コード例 #10
0
class Legend(object):
    def __init__(self, data=None, axes=None, *aw, **kw):

        self.text_size = 0
        self.column_width = 0
        self.labels = {}
        if isinstance(data, dict):
            for label, ddict in data.items():
                # self.labels[label] = pretty_float(max([ float(x) for x in ddict.values() if x ]) )
                self.labels[label] = "%.1f" % max(
                    [float(x) for x in ddict.values() if x])
        elif isinstance(data, GraphData):
            self.labels = data.getLabels()
        else:
            self.labels = data
        # self.labels.reverse()
        self.ax = axes
        self.canvas = None
        if self.ax:
            self.canvas = self.ax.figure.canvas
            self.ax.set_axis_off()
        self.prefs = evalPrefs(*aw, **kw)
        self.palette = Palette()

        if self.labels and self.labels[0][0] != "NoLabels":
            percent_flag = self.prefs.get("legend_unit", "")
            if percent_flag == "%":
                sum_value = sum(data.label_values)
                if sum_value > 0.0:
                    self.labels = [(l, v / sum_value * 100.0)
                                   for l, v in self.labels]
        self.__get_column_width()

    def dumpPrefs(self):

        for key in self.prefs:
            print(key.rjust(20), ":", str(self.prefs[key]).ljust(40))

    def setLabels(self, labels):

        self.labels = labels

    def setAxes(self, axes):

        self.ax = axes
        self.canvas = self.ax.figure.canvas
        self.ax.set_axis_off()

    def getLegendSize(self):
        self.__get_column_width()
        legend_position = self.prefs["legend_position"]
        legend_width = float(self.prefs["legend_width"])
        legend_height = float(self.prefs["legend_height"])
        legend_padding = float(self.prefs["legend_padding"])
        legend_text_size = self.prefs.get("legend_text_size",
                                          self.prefs["text_size"])
        legend_text_padding = self.prefs.get("legend_text_padding",
                                             self.prefs["text_padding"])
        if legend_position in ["right", "left"]:
            # One column in case of vertical legend
            legend_width = self.column_width + legend_padding
            nLabels = len(self.labels)
            legend_max_height = nLabels * (legend_text_size +
                                           legend_text_padding)
        elif legend_position == "bottom":
            nColumns = min(self.prefs["legend_max_columns"],
                           int(legend_width / self.column_width))
            nLabels = len(self.labels)
            maxRows = self.prefs["legend_max_rows"]
            nRows_ax = int(legend_height / 1.6 / self.prefs["text_size"])
            nRows_label = nLabels / nColumns + (nLabels % nColumns != 0)
            nRows = int(max(1, min(min(nRows_label, maxRows), nRows_ax)))
            text_padding = self.prefs["text_padding"]
            text_padding = pixelToPoint(text_padding, self.prefs["dpi"])
            legend_height = int(
                min(legend_height,
                    (nRows * (self.text_size + text_padding) + text_padding)))
            legend_max_height = int(nLabels * (self.text_size + text_padding))
        return legend_width, legend_height, legend_max_height

    def __get_legend_text_size(self):

        text_size = self.prefs["text_size"]
        text_padding = self.prefs["text_padding"]
        legend_text_size = self.prefs.get("legend_text_size", text_size)
        legend_text_padding = self.prefs.get("legend_text_padding",
                                             text_padding)
        return legend_text_size, legend_text_padding

    def __get_column_width(self):

        max_length = 0
        max_column_text = ""
        flag = self.prefs.get("legend_numbers", True)
        unit = self.prefs.get("legend_unit", False)
        for label, num in self.labels:
            if not flag:
                num = None
            if num is not None:
                column_length = len(str(label) + str(num)) + 1
            else:
                column_length = len(str(label)) + 1
            if column_length > max_length:
                max_length = column_length
                if flag:
                    if isinstance(num, six.integer_types):
                        numString = str(num)
                    else:
                        numString = "%.1f" % float(num)
                    max_column_text = "%s  %s" % (str(label), numString)
                    if unit:
                        max_column_text += "%"
                else:
                    max_column_text = "%s   " % str(label)

        figure = Figure()
        canvas = FigureCanvasAgg(figure)
        dpi = self.prefs["dpi"]
        figure.set_dpi(dpi)
        l_size, _ = self.__get_legend_text_size()
        self.text_size = pixelToPoint(l_size, dpi)
        text = Text(0.0, 0.0, text=max_column_text, size=self.text_size)
        text.set_figure(figure)
        bbox = text.get_window_extent(canvas.get_renderer())
        columnwidth = bbox.width + 6 * l_size
        # make sure the legend fit in the box
        self.column_width = (columnwidth
                             if columnwidth <= self.prefs["legend_width"] else
                             self.prefs["legend_width"] - 6 * l_size)

    def draw(self):

        dpi = self.prefs["dpi"]
        ax_xsize = self.ax.get_window_extent().width
        ax_ysize = self.ax.get_window_extent().height
        nLabels = len(self.labels)
        nColumns = min(self.prefs["legend_max_columns"],
                       int(ax_xsize / self.column_width))

        maxRows = self.prefs["legend_max_rows"]
        nRows_ax = int(ax_ysize / 1.6 / self.prefs["text_size"])
        nRows_label = nLabels / nColumns + (nLabels % nColumns != 0)
        nRows = max(1, min(min(nRows_label, maxRows), nRows_ax))
        self.ax.set_xlim(0.0, float(ax_xsize))
        self.ax.set_ylim(-float(ax_ysize), 0.0)

        legend_text_size, legend_text_padding = self.__get_legend_text_size()
        legend_text_size_point = pixelToPoint(legend_text_size, dpi)

        box_width = legend_text_size
        legend_offset = (ax_xsize - nColumns * self.column_width) / 2

        nc = 0
        # self.labels.reverse()

        for label, num in self.labels:
            num_flag = self.prefs.get("legend_numbers", True)
            percent_flag = self.prefs.get("legend_unit", "")
            if num_flag:
                if percent_flag == "%":
                    num = "%.1f" % num + "%"
                else:
                    num = "%.1f" % num
            else:
                num = None
            color = self.palette.getColor(label)
            row = nc % nRows
            column = int(nc / nRows)
            if row == nRows - 1 and column == nColumns - 1 and nc != nLabels - 1:
                last_text = "... plus %d more" % (nLabels - nc)
                self.ax.text(
                    float(column * self.column_width) + legend_offset,
                    -float(row * 1.6 * box_width),
                    last_text,
                    horizontalalignment="left",
                    verticalalignment="top",
                    size=legend_text_size_point,
                )
                break
            else:
                self.ax.text(
                    float(column * self.column_width) + 2.0 * box_width +
                    legend_offset,
                    -row * 1.6 * box_width,
                    str(label),
                    horizontalalignment="left",
                    verticalalignment="top",
                    size=legend_text_size_point,
                )
                if num is not None:
                    self.ax.text(
                        float((column + 1) * self.column_width) -
                        2 * box_width + legend_offset,
                        -float(row * 1.6 * box_width),
                        str(num),
                        horizontalalignment="right",
                        verticalalignment="top",
                        size=legend_text_size_point,
                    )
                box = Rectangle(
                    (float(column * self.column_width) + legend_offset,
                     -float(row * 1.6 * box_width) - box_width),
                    box_width,
                    box_width,
                )
                box.set_edgecolor("black")
                box.set_linewidth(pixelToPoint(0.5, dpi))
                box.set_facecolor(color)
                self.ax.add_patch(box)
                nc += 1