Визуализация координат с помощью matplotlib

Хочу визуализировать прописанный алгоритм игры в морской бой. Отрисовку поля с расставленными кораблями сделал так:

def createField(): 

    fig,ax = plt.subplots(1, figsize=(12,12)) # Создаем полотно
    rect = patches.Rectangle((0, 0),10,10, linewidth=3, edgecolor='red', fill=True) # Создаем прямоугольник вокруг всего игрового поля
    ax.add_patch(rect) # Рисуем прямоугольник

    # 4-x палубник
    rect = patches.Rectangle((1,1),1,4,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоуогльник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугольник      


    # 3-x палубник 1-ый
    rect = patches.Rectangle((8,6),1,3,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугльник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугльник      

    # 3-x палубник 2-ый
    rect = patches.Rectangle((3,5),3,1,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугольник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугольник 

    # 2-x палубник 1-ый
    rect = patches.Rectangle((3,8),2,1,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугольник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугольник      

    # 2-x палубник 2-ый
    rect = patches.Rectangle((4,2),2,1,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугльник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугльник 

    # 2-x палубник 3-ый
    rect = patches.Rectangle((0,7),1,2,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугольник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугольник 

    # 1-о палубник 1-ый
    rect = patches.Rectangle((7,0),1,1,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугльник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугльник      

    # 1-о палубник 2-ый
    rect = patches.Rectangle((8,3),1,1,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугольник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугольник 

    # 1-о палубник 3-ый
    rect = patches.Rectangle((6,7),1,1,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугольник стартовой позиции
    ax.add_patch(rect) ## Рисуем прямоугольник 

    # 1-о палубник 4-ый
    rect = patches.Rectangle((3,0),1,1,linewidth=1, edgecolor='black',facecolor='red', alpha=0.5) # Создаем прямоугльник стартовой позиции
    # ax.add_patch(rect) ## Рисуем прямоугльник 

    # Рисуем "опасные" прямоугольники по границе игрового поля
    for i in range(10):
      for j in range(10):
        rect = patches.Rectangle((i,j),1,-1,linewidth=1, edgecolor='white',facecolor='white', alpha=0.1)
        ax.add_patch(rect)

    ax.grid()
    ax.add_patch(rect) # Рисуем прямоугльник
    plt.xticks(np.arange(10))
    plt.yticks(np.arange(10))
    ax.grid()
    plt.show()

    return fig, ax

Поле выглядит вот так:

введите сюда описание изображения

Далее, к примеру, алгоритм просчитал ходы positions=[[9, 0], [5, 3], [6, 6], [6, 5], [7, 6], [5, 6], [8, 6], [9, 6], [2, 3], [2, 4], [2, 5], [6, 2], [4, 1], [7, 1], [8, 1], [6, 1], [2, 8], [4, 8], [6, 9], [8, 8], [1, 8]] и я их хочу по очереди показать на отрисованном поле выделяющейся ячейкой, приблизительно вот так:

введите сюда описание изображения

и дальше сделать в реальном времени в цикле отрисовку всех координат из списка по очереди, убирая предыдущие показанные.

Пытался сделать сначала просто в цикле отрисовку ходов линиями, но даже их не получается нарисовать

positions=[[9, 0], [5, 3], [6, 6], [6, 5], [7, 6], [5, 6], [8, 6], [9, 6], [2, 3], [2, 4], [2, 5], [6, 2], [4, 1], [7, 1], [8, 1], [6, 1], [2, 8], [4, 8], [6, 9], [8, 8], [1, 8]]
        
fig,ax= createField()
            
for p in range(len(positions)-1):
  x = positions[p][0]
  y = positions[p][1]
  a.plot(x, y, marker = 'o', color = 'g', linewidth=4)
  plt.show()

Была попытка сделать вот так, но тоже безрезультатно:

positions=[[9, 0], [5, 3], [6, 6], [6, 5], [7, 6], [5, 6], [8, 6], [9, 6], [2, 3], [2, 4], [2, 5], [6, 2], [4, 1], [7, 1], [8, 1], [6, 1], [2, 8], [4, 8], [6, 9], [8, 8], [1, 8]]

fig,ax= createField()



for p in range(len(positions)-1):
    x = positions[p][0]
    y = positions[p][1]
    rect = patches.Rectangle(x,y,1,1,linewidth=5, edgecolor='black',facecolor='black', alpha=1) # Создаем прямоугльник стартовой позиции
    ax.add_patch(rect) # Рисуем прямоугльник 
 

    plt.show()

Где я ошибаюсь?

Также рассматривал примеры визуализации графиков с помощью анимации, но тут тоже ничего не получилось.

fig,ax= createField()

line, = ax.plot([], [], lw=3)

def init():
    line.set_data([], [])
    return line,
def animate(a,b):
    line.set_data(a, b)
    return line

for p in range(len(positions)-1):
    x = [positions[p][0]+0.5, positions[p+1][0]+0.5]
    y = [positions[p][1]+0.5, positions[p+1][1]+0.5]
    anim = FuncAnimation(fig, animate(x,y), init_func=init,
                               frames=200, interval=10, blit=True)
plt.show()    

Если добавить в конце fig.show(), то понятно, что он выведет все координаты сразу

positions=[[9, 0], [5, 3], [6, 6], [6, 5], [7, 6], [5, 6], [8, 6], [9, 6], [2, 3], [2, 4], [2, 5], [6, 2], [4, 1], [7, 1], [8, 1], [6, 1], [2, 8], [4, 8], [6, 9], [6, 0], [1, 8]]

fig,ax= createField()

for p in range(len(positions)-1):

    x = positions[p][0]
    y = positions[p][1]

    rect = patches.Rectangle((x,y),1,1,linewidth=1, edgecolor='red',facecolor='red', alpha=0.6) 
    ax.add_patch(rect)
 

fig.show()

введите сюда описание изображения

а если вставляем отрисовку поля в цикл, то, конечно же, он выдаёт отрисованные точки, но на каждом фрейме

positions=[[9, 0], [5, 3], [6, 6], [6, 5], [7, 6], [5, 6], [8, 6], [9, 6], [2, 3], [2, 4], [2, 5], [6, 2], [4, 1], [7, 1], [8, 1], [6, 1], [2, 8], [4, 8], [6, 9], [6, 0], [1, 8]]


for p in range(len(positions)-1):

    fig,ax= createField()
    x = positions[p][0]
    y = positions[p][1]


    rect = patches.Rectangle((x,y),1,1,linewidth=1, edgecolor='red',facecolor='red', alpha=0.6) # Создаем прямоугльник стартовой позиции
    ax.add_patch(rect)
 

fig.show()

введите сюда описание изображения

Вот просто не понимаю, как оставить один график, но выводить поочерёдно координаты в виде выделенного квадрата.


Ответы (0 шт):