Визуализация координат с помощью 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()
Вот просто не понимаю, как оставить один график, но выводить поочерёдно координаты в виде выделенного квадрата.



