Ich versuche, Sortieralgorithmen mithilfe von Matplot zu visualisieren (wobei ich anhand von Benutzereingaben festlege, welcher Algorithmus verwendet werden soll und wie groß er ist). eine zu verwendende Liste) und möchten die Farbe des aktuellen Balkens (in jedem Frame der Animation) auf eine andere Farbe als die anderen festlegen, um anzuzeigen, welches Element in der Liste der Algorithmus gerade sortiert.Ich habe versucht, darauf zuzugreifen BarContainer in der Funktion animate() erstellen und unter anderem die Farben als separaten Generator für jeden Frame erstellen und auf diese Weise die Liste der Farben zuweisen. Ich habe Schwierigkeiten zu verstehen, wie ich das erreichen kann, ohne alle meine Module neu zu schreiben und die Plotgenerationen mit den Algorithmen selbst in einen Topf zu werfen.
Unten ist mein plot.py Modul:
Code: Select all
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import sortalgorithms as sort
import random
fig, axis = plt.subplots()
bar_plots = axis.bar(0, 0)
text = axis.text(0, 0, 0)
iteration_counter = []
def animate(size, rectangle, iteration):
for rect, val in zip(rectangle, size):
rect.set_height(val)
iteration[0] += 1
text.set_text("Iterations : {}".format(iteration[0]))
def plot_algorithm(selected_algorithm, sample_size=None, given_data=None):
global fig, axis
global bar_plots
global text
global iteration_counter
fig, axis = plt.subplots()
data_set = []
generator = ()
if given_data is None:
[data_set.append(x) for x in range(1, int(sample_size))]
random.shuffle(data_set)
elif sample_size is None:
data_set = given_data
if selected_algorithm == 1:
generator = sort.bubble_sort(data_set)
elif selected_algorithm == 2:
generator = sort.visual_merge_sort(data_set)
elif selected_algorithm == 3:
generator = sort.insertion_sort(data_set)
bar_plots = axis.bar(range(len(data_set)), data_set, align="edge")
if len(data_set) data_set[i + 1]:
data_set[i], data_set[i + 1] = data_set[i + 1], data_set[i]
swapped = True
yield data_set
if not swapped:
break
yield data_set