#! /usr/bin/python3 # =================================================================== # draw/plot a bell curve # =================================================================== # Formula from: # # statistics.about.com/od/Formulas/ss/ # The-Normal-Distribution-Or-Bell-Curve.htm # # =================================================================== # # Notes: # # 1. The bell curve formula normalizes the area under the # curve to 1. # 2. All Y values are bell curve formula values and less than 1. # 3. When plotting, the X values are scaled. # 4. When plotting, the Y values are scaled. # 5. Some day re-code to read a data file. # # =================================================================== import numpy as np import draw_axes as ax import coordinate_conversion as cc import user_interface as ui from graphics import * # ---- global variables xscale = 50.0 # scale bell curve plot yscale = 50.0 # scale bell curve plot mean = 0.0 # plot mean value sd = 1.0 # plot standard deviation # ---- bell curve x values (standard deviation units) xdata = [ -3.00,-2.75,-2.50,-2.25, -2.00,-1.75,-1.50,-1.25, -1.00,-0.75,-0.50,-0.25, 0.00, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 2.50, 2.75, 3.00 ] # ------------------------------------------------------------------- # ---- return the bell curve y value for a given x value # ---- x value (standard deviation units) # ---- mean (center of distribution) # ---- sd standard deviation # ------------------------------------------------------------------- def BellCurveValue(x,m,sd): y = (1.0/sd*np.sqrt(2.0*np.pi)) * \ pow(np.e,-pow(x-m,2.0)/(2.0*sd*sd)) return y # ------------------------------------------------------------------- # ---- plot the bell curve # ---- xdata bell curve x points to plot # ---- xscale x scale factor # ---- yscale y scale factor # ---- m mean value (middle of bell curve) # ---- sd standard deviation # ------------------------------------------------------------------- def PlotBellCurve(xdata,xscale,yscale,m,sd): win = GraphWin("Bell Curve", 801, 801) win.setBackground("white") ax.draw_xy_axes(win,True) for x in xdata: y = BellCurveValue(x,m,sd) cy = round(y * yscale) cx = round(x * xscale) (wx,wy) = cc.center_to_win_coords(cx,cy,win.width,win.height) ##l = Line(Point(wx,wy),Point(wx+1,wy+1)) ##l.setWidth(2) ##l.setFill('black') ##l.draw(win) c = Circle(Point(wx,wy),4) c.setFill('black') c.draw(win) return win # ------------------------------------------------------------------- # ---- main # ------------------------------------------------------------------- if __name__ == '__main__': # ---- plot bell curve win = PlotBellCurve(xdata,xscale,yscale,mean,sd) ui.pause() win.close()