Requisitos previos: ordenación por inserción , introducción a Matplotlib
La visualización de algoritmos facilita su comprensión al analizar y comparar la cantidad de operaciones que tuvieron lugar para comparar e intercambiar los elementos. La visualización 3D de algoritmos es menos común, para esto usaremos matplotlib para trazar gráficos de barras y animarlos para representar los elementos de la array.
Acercarse:
- Generaremos una array con elementos aleatorios.
- Se llamará al algoritmo en esa array y se usará la declaración de rendimiento en lugar de la declaración de retorno para fines de visualización.
- Daremos los estados actuales de la array después de comparar e intercambiar. Por lo tanto, el algoritmo devolverá un objeto generador.
- La animación de Matplotlib se utilizará para visualizar la comparación y el intercambio de la array.
- Luego trazaremos el gráfico, que devolverá un objeto de Poly3dCollection con el que se realizará más animación.
A continuación se muestra la implementación.
Python3
# import the modules 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 # Array size n = 11 # insertion sort algorithm def insertionsort(a): for j in range(1, len(a)): key = a[j] i = j-1 while(i >= 0 and a[i] > key): a[i+1] = a[i] i -= 1 yield a a[i+1] = key yield a # method to plot graph def showGraph(n): # for random unique values a = [i for i in range(1, n+1)] random.shuffle(a) datasetName = 'Random' algoName = 'Insertion Sort' # generator object returned by the function generator = insertionsort(a) # the style of the graph plt.style.use('fivethirtyeight') # set bar colors 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)] } ) # plot the array fig = plt.figure() ax = fig.add_subplot(projection='3d') # the z values and position of the bars z = np.zeros(n) dx = np.ones(n) dy = np.ones(n) dz = [i for i in range(len(a))] # plot 3d bars 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'}) # 2D text placed on the upper left # based on the axes fraction text = ax.text2D(0.1, 0.95, "", horizontalalignment='center', verticalalignment='center', transform=ax.transAxes, color="#E4365D") iteration = [0] # function for animating def animate(A, rects, iteration): # to clear the bars from the # Poly3DCollection object 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() # Driver Code showGraph(n)
Producción :
Publicación traducida automáticamente
Artículo escrito por maryamnadeem20 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA