Visualizing algorithms makes it easier to understand them by analyzing and comparing the number of operations that took place to compare and swap the elements. For this we will use matplotlib, to plot bar graphs to represent the elements of the array,
Approach:
We will generate an array with random elements.
The algorithm will be called on that array and yield statement will be used instead of a return statement for visualization purposes.
We will yield the current states of the array after comparing and swapping. Hence the algorithm will return a generator object.
Matplotlib animation will be used to visualize the comparing and swapping of the array.
The array will be stored in a matplotlib bar container object ('rects'), where the size of each bar will be equal to the corresponding value of the element in the array.
The inbuilt FuncAnimation method of matplotlib animation will pass the container and generator objects to the function used to create animation. Each frame of the animation corresponds to a single iteration of the generator.
The animation function is repeatedly called will set the height of the rectangle equal to the value of the elements.
Python3
# import all the modulesimportmatplotlib.pyplotaspltfrommatplotlib.animationimportFuncAnimationimportmatplotlibasmpimportnumpyasnpimportrandom# set the style of the graphplt.style.use('fivethirtyeight')# input the size of the array (list here)# and shuffle the elements to create# a random listn=int(input("enter array size\n"))a=[iforiinrange(1,n+1)]random.shuffle(a)# insertion sortdefinsertionsort(a):forjinrange(1,len(a)):key=a[j]i=j-1while(i>=0anda[i]>key):a[i+1]=a[i]i-=1# yield the current position# of elements in ayieldaa[i+1]=keyyielda# generator object returned by the functiongenerator=insertionsort(a)# to set the colors of the bars.data_normalizer=mp.colors.Normalize()color_map=mp.colors.LinearSegmentedColormap("my_map",{"red":[(0,1.0,1.0),(1.0,.5,.5)],"green":[(0,0.5,0.5),(1.0,0,0)],"blue":[(0,0.50,0.5),(1.0,0,0)]})fig,ax=plt.subplots()# the bar containerrects=ax.bar(range(len(a)),a,align="edge",color=color_map(data_normalizer(range(n))))# setting the view limit of x and y axesax.set_xlim(0,len(a))ax.set_ylim(0,int(1.1*len(a)))# the text to be shown on the upper left# indicating the number of iterations# transform indicates the position with# relevance to the axes coordinates.text=ax.text(0.01,0.95,"",transform=ax.transAxes)iteration=[0]# function to be called repeatedly to animatedefanimate(A,rects,iteration):# setting the size of each bar equal# to the value of the elementsforrect,valinzip(rects,A):rect.set_height(val)iteration[0]+=1text.set_text("iterations : {}".format(iteration[0]))anim=FuncAnimation(fig,func=animate,fargs=(rects,iteration),frames=generator,interval=50,repeat=False)plt.show()
We use cookies to ensure you have the best browsing experience on our website. By using our site, you
acknowledge that you have read and understood our
Cookie Policy &
Privacy Policy
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.