from pylab import * xpoints = arange(-6,6,0.05) ypoints = arange(-6,6,0.05) X,Y = meshgrid(xpoints, ypoints) circularMask = False areaRadius = 4 # order of the magnet n = 3 def func(x,y): # the function to draw return ((x + 1j * y)**(n)).real func = vectorize(func) V = func(X,Y) # mask points which we don't want to draw if circularMask: # circular mask distance = sqrt(X**2 + Y**2) V = ma.masked_where(distance > areaRadius, V) else: # polygonal mask # principal directions are at (i + 0.5) / (2n) * 2pi # for i in range(2*n): angle = (i + 0.5) / float(2*n) * 2*pi # define a straight angle perpendicular to angle # mask all points on one side of this line anchor_x = areaRadius * cos(angle) anchor_y = areaRadius * sin(angle) normal_x = cos(angle) normal_y = sin(angle) def acceptFunc(x,y): value = (x - anchor_x) * normal_x + (y - anchor_y) * normal_y return value > 0 acceptFunc = vectorize(acceptFunc) V = ma.masked_where(acceptFunc(X,Y), V) if True: # levels equidistant in function value V /= V.max() levels = arange(-2,2,0.05) else: # levels equidistant on x and y axis # determine the levels to draw from values on one of the axes levels = [ float(func(x,0)) for x in arange(min(xpoints), max(xpoints),0.50) ] + \ [ float(func(0,y)) for y in arange(min(ypoints), max(ypoints),0.50) ] levels = sorted(list(set(levels))) figure(figsize=(6,6)); Q = contour(X,Y, V, colors= 'black', linestyles = 'solid', levels = levels ) axis([-5,5,-5,5]) xlabel("x coordinate") ylabel("y coordinate") # mask points which we don't want to draw if not circularMask: # polygonal mask # principal directions are at (i + 0.5) / (2n) * 2pi # for i in range(2*n): angle = (i + 0.5) / float(2*n) * 2*pi if i % 2: label = "N" color = 'red' else: label = "S" color = 'green' anchor_x = 1.1 * areaRadius * cos(angle) anchor_y = 1.1 * areaRadius * sin(angle) text(anchor_x, anchor_y, label, size = 20, color = color, horizontalalignment='center', verticalalignment='center')