Кажется невозможным изменить пределы просмотра по осям 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
?