3D Visualisation of Quick Sort using Matplotlib in Python (original) (raw)

import matplotlib.pyplot as plt

from matplotlib.animation import FuncAnimation

from mpl_toolkits.mplot3d import axes3d

import matplotlib as mp

import numpy as np

import random

def 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 quicksort(a, l, j - 1 )

`` yield from quicksort(a, j + 1 , r)

def showGraph():

`` n = int ( input ( "enter array size\n" ))

`` a = [i for i in range ( 1 , n + 1 )]

`` random.shuffle(a)

`` datasetName = 'Random'

`` generator = quicksort(a, 0 , n - 1 )

`` algoName = 'Quick Sort'

`` plt.style.use( 'fivethirtyeight' )

`` 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 = plt.figure()

`` ax = fig.add_subplot(projection = '3d' )

`` z = np.zeros(n)

`` dx = np.ones(n)

`` dy = np.ones(n)

`` dz = [i for i in range ( len (a))]

`` rects = ax.bar3d( range ( len (a)), a, z, dx,

`` dy, dz,

`` color = color_map(data_normalizer( range (n))))

`` 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' })

`` text = ax.text2D( 0.1 , 0.95 , "", horizontalalignment = 'center' ,

`` verticalalignment = 'center' ,

`` transform = ax.transAxes,

`` color = "#E4365D" )

`` iteration = [ 0 ]

`` def animate(A, rects, iteration):

`` ax.collections.clear()

`` ax.bar3d( range ( len (a)), A, z, dx,

`` dy, dz,

`` color = color_map(data_normalizer( range (n))))

`` iteration[ 0 ] + = 1

`` text.set_text( "iterations : {}" . format (iteration[ 0 ]))

`` anim = FuncAnimation(fig, func = animate,

`` fargs = (rects, iteration),

`` frames = generator, interval = 50 ,

`` repeat = False )

`` plt.show()

showGraph()