Visualization of Quick sort using Matplotlib - GeeksforGeeks

02 Sep, 2021
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 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 the animation will be used to visualize the comparing and swapping of the array.The array will be stored in a matplotlib bar container object (‘bar_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 being repeatedly called will set the height of the rectangle equal to the value of the elements.
We will generate an array with random elements.
The algorithm will be called on that array and yield statement will be used instead of 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 the animation will be used to visualize the comparing and swapping of the array.
The array will be stored in a matplotlib bar container object (‘bar_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 being repeatedly called will set the height of the rectangle equal to the value of the elements.
python3
# import all the modulesimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimationfrom mpl_toolkits.mplot3d import axes3dimport matplotlib as mpimport numpy as npimport random # quicksort functiondef quicksort(a, l, r):    if l >= r:        return    x = a[l]    j = l    for i in range(l + 1, r + 1):        if a[i] <= x:            j += 1            a[j], a[i] = a[i], a[j]        yield a    a[l], a[j]= a[j], a[l]    yield a     # yield from statement used to yield    # the array after dividing    yield from quicksort(a, l, j-1)    yield from quicksort(a, j + 1, r) # function to plot barsdef showGraph():     # for random unique values    n = int(input("enter array size\n"))    a = [i for i in range(1, n + 1)]    random.shuffle(a)    datasetName ='Random'     # generator object returned by the function    generator = quicksort(a, 0, n-1)    algoName = 'Quick Sort'     # style of the chart    plt.style.use('fivethirtyeight')     # set 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()     # bar container    bar_rects = ax.bar(range(len(a)), a, align ="edge",                       color = color_map(data_normalizer(range(n))))     # setting the limits of x and y axes    ax.set_xlim(0, len(a))    ax.set_ylim(0, int(1.1 * len(a)))    ax.set_title("ALGORITHM : "+ algoName + "\n" + "DATA SET : " +             datasetName, fontdict = {'fontsize': 13, 'fontweight':                                      'medium', 'color' : '#E4365D'})     # 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, color = "#E4365D")    iteration = [0]     def animate(A, rects, iteration):        for rect, val in zip(rects, A):             # setting the size of each bar equal to the value of the elements            rect.set_height(val)        iteration[0] += 1        text.set_text("iterations : {}".format(iteration[0]))     # call animate function repeatedly    anim = FuncAnimation(fig, func = animate,        fargs = (bar_rects, iteration), frames = generator, interval = 50,        repeat = False)    plt.show() showGraph()
Output :  
For array size 20
 
 
rajeev0719singh
Python-matplotlib
Quick Sort
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Read JSON file using Python
Adding new column to existing DataFrame in Pandas
Python map() function
How to get column names in Pandas dataframe
Python Dictionary
Taking input in Python
Read a file line by line in Python
Enumerate() in Python
How to Install PIP on Windows ?
Iterate over a list in Python