Динамическое масштабирование осей во время matplotlib ArtistAnimation - PullRequest
0 голосов
/ 09 апреля 2020

Кажется невозможным изменить пределы просмотра по осям Y и X во время ArtistAnimation, и кадры воспроизводятся с различными пределами оси.

Кажется, что ограничения установлены на последние, заданные до вызова функции анимации.

В приведенном ниже коде у меня есть два этапа построения. Входные данные на втором графике - это гораздо меньшее подмножество данных в 1-м кадре. Данные на 1-м этапе имеют гораздо более широкий диапазон.

Итак, мне нужно «увеличить» при отображении второго графика (в противном случае график будет очень маленьким, если пределы оси останутся прежними). ​​

Два графика накладываются на два разные изображения (одинакового размера, но разного содержания).

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.image as mpimg

import random


# sample 640x480 image. Actual frame loops through 
# many different images, but of same size
image = mpimg.imread('image_demo.png')

fig = plt.figure()
plt.axis('off')

ax = fig.gca()

artists = []

def plot_stage_1():
  # both x, y axis limits automatically set to 0 - 100
  # when we call ax.imshow with this extent 
  im_extent = (0, 100, 0, 100) # (xmin, xmax, ymin, ymax)

  im = ax.imshow(image, extent=im_extent, animated=True)

  # y axis is a list of 100 random numbers between 0 and 100
  p, = ax.plot(range(100), random.choices(range(100), k=100))

  # Text label at 90, 90
  t = ax.text(im_extent[1]*0.9, im_extent[3]*0.9, "Frame 1")

  artists.append([im, t, p])


def plot_stage_2():
  # axes remain at the the 0 - 100 limit from the previous
  # imshow extent so both the background image and plot are tiny
  im_extent = (0, 10, 0, 10) 

  # so let's update the x, y axis limits
  ax.set_xlim(im_extent[0], im_extent[1])
  ax.set_ylim(im_extent[0], im_extent[3])

  im = ax.imshow(image, extent=im_extent, animated=True)

  p, = ax.plot(range(10), random.choices(range(10), k=10))

  # Text label at 9, 9
  t = ax.text(im_extent[1]*0.9, im_extent[3]*0.9, "Frame 2")

  artists.append([im, t, p])

plot_stage_1()
plot_stage_2()

# clear white space around plot
fig.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=None, hspace=None)
# set figure size
fig.set_size_inches(6.67, 5.0, True)

anim = animation.ArtistAnimation(fig, artists, interval=2000, repeat=False, blit=False)

plt.show()

Если я вызову только одну из двух указанных выше функций, сюжет будет в порядке. Однако, если я вызову оба, пределы оси в обоих кадрах будут 0 - 10, 0 - 10. Таким образом, кадр 1 будет увеличен.

Также вызывается ax.set_xlim(0, 100), ax.set_ylim(0, 100) в plot_stage_1() не помогает Последние вызовы set_xlim(), set_ylim() фиксируют пределы осей во всех кадрах анимации.

Я могу сохранить фиксированные границы осей и применить функцию масштабирования к входным данным.

Тем не менее, мне любопытно узнать, могу ли я просто изменить пределы оси - мой код будет лучше таким образом, потому что реальный код сложен из нескольких этапов, масштабируя графики по различным диапазонам.

Или, возможно, мне нужно изменить код, чтобы использовать FuncAnimation вместо ArtistAnimation?

1 Ответ

0 голосов
/ 09 апреля 2020

FuncAnimation приводит к ожидаемому поведению. Поэтому я изменяю свой код, чтобы использовать его вместо ArtistAnimation.

Тем не менее любопытно узнать, можно ли вообще это сделать, используя ArtistAnimation.

...