Динамическое масштабирование осей во время matplotlib ArtistAnimation
Кажется, невозможно изменить пределы просмотра осей 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 ответ
FuncAnimation
приводит к ожидаемому поведению. Поэтому я меняю свой код, чтобы использовать его вместоArtistAnimation
.
Тем не менее, любопытно узнать, можно ли это вообще сделать с помощью ArtistAnimation
.