Skip to content
Extraits de code Groupes Projets
Histogram.py 2,85 ko
Newer Older
  • Learn to ignore specific revisions
  • class Histogram:
    
    Martin Delcourt's avatar
    Martin Delcourt a validé
        def __init__(self, n_bins, a, b):
            """Crée un histograme de n_bins réparties uniformément entre a et b"""
            self._data = [0 for i in range(n_bins)]
            self._n_bins = n_bins
            self._a = a
            self._b = b
    
        def fill(self, x):
            """Remplis la bin correspondant à la valeur 'x'"""
            bin_number = int((x-self._a)*self._n_bins/(self._b-self._a))
            if bin_number >= 0 and bin_number < self._n_bins:
                self._data[bin_number] += 1
                return bin_number
            else:
                print("Warning, {} out of bounds.".format(x))
                return -1
    
        def get_maximum(self):
            """Retourne le maximum de l'histogramme"""
            maximum = self._data[0]
            for x in self._data[1:]:
                if x > maximum:
                    maximum = x
            return maximum
    
    
        def draw(self):
            """Affiche l'histogramme en console"""
            y_max = self.get_maximum()
            scale = 1.
            if y_max > 50:
                scale = 50*1./y_max
                y_max = 50
            # vertical axis : 50 pxl
            y = y_max + 1
            while y > 0:
                to_print = ""
                if (y == y_max+1):
                    to_print = "y ^"
                else:
                    to_print = "  |"
    
                for x in range(self._n_bins):
                    if self._data[x] >= y/scale:
                        to_print += "#"
                    else:
                        to_print += " "
                print (to_print)
                y-=1
    
            print (" -"+"+"+(self._n_bins-1)*"-"+">")
            print ("  |"+(self._n_bins-1)*" "+"x")
            if scale != 1:
                print ("y-axis scale : 1 # = {}".format(1./scale))
    
    
    fbury's avatar
    fbury a validé
        def drawT(self):
            """Affiche l'histogramme en console verticalement (plus facile) """
            # Scale my data (bin content) to a fixed width #
            y_max = self.get_maximum()
            width = 60
            scale = width/y_max
            scaled_data = [b*scale for b in self._data]
            # Draw y axis #
            print ('-' * width + '> y')
            # Draw bin by bin #
            for ibin,bin_content in enumerate(scaled_data):
                line = f'{ibin:3d}|'
                for y in range(width):
                    if bin_content>= y:
                        line += "#"
                    else:
                        line += " "
                # Show the unscaled bin content on the right #
                line += f'\t{self._data[ibin]:6.0f}'
                print (line)
            # Draw end of x axis #
            print ('   v')
            print ('   x')
            # Print scaling of histogram #
            print (f'Scaling : `#` = {scale:.5f}')
    
    Martin Delcourt's avatar
    Martin Delcourt a validé
    
    
    
    if __name__=="__main__":
    
        h = Histogram(10,0,1)
    
    Martin Delcourt's avatar
    Martin Delcourt a validé
        h.fill(0.5)
        h.fill(0.5)
        h.fill(0.5)
        h.fill(0.1)
        h.fill(2)
        h.fill(-1)
    
    fbury's avatar
    fbury a validé
        #h.draw()
        h.drawT()
    
    Martin Delcourt's avatar
    Martin Delcourt a validé
    
    
    fbury's avatar
    fbury a validé
        h2 = Histogram(50,-5,5)
    
    Martin Delcourt's avatar
    Martin Delcourt a validé
        from random import gauss
    
    fbury's avatar
    fbury a validé
        for i in range(int(1000000)):
    
    Martin Delcourt's avatar
    Martin Delcourt a validé
            h2.fill(gauss(0,1))
    
    fbury's avatar
    fbury a validé
        h2.drawT()