matplotlib.animation
#
애니메이션 #
Matplotlib에서 라이브 애니메이션을 만드는 가장 쉬운 방법은
Animation
클래스 중 하나를 사용하는 것입니다.
애니메이션의 기본 클래스입니다. |
|
func 함수를 반복적으로 호출하여 애니메이션을 만듭니다 . |
|
고정된 |
두 경우 모두 인스턴스 개체에 대한 참조를 유지하는 것이 중요합니다. Animation
애니메이션은 개체가 유일한 참조를 보유 하는 타이머(일반적으로 호스트 GUI 프레임워크에서)에 의해 진행 됩니다. 개체 에 대한 참조를 보유하지 않으면 Animation
개체(따라서 타이머)가 가비지 수집되어 애니메이션이 중지됩니다.
애니메이션을 저장하려면 Animation.save
, Animation.to_html5_video
또는 를 사용 Animation.to_jshtml
하십시오.
지원되는 동영상 형식에 대한 자세한 내용은 아래 도우미 클래스 를 참조 하세요.
FuncAnimation
#
의 내부 작동 방식은 대략 다음과 FuncAnimation
같습니다.
for d in frames:
artists = func(d, *fargs)
fig.canvas.draw_idle()
fig.canvas.start_event_loop(interval)
'블리팅'(라이브 성능을 극적으로 향상시키기 위해)을 처리하기 위한 세부 정보, 비차단, GUI 이벤트 루프를 반복적으로 시작/중지하지 않고, 반복 처리, 여러 애니메이션 축, 동영상 파일에 애니메이션을 쉽게 저장합니다.
'Blitting'은 컴퓨터 그래픽 의 표준 기술 입니다. 일반적인 요지는 기존 비트맵(우리의 경우 대부분 래스터화된 그림)을 가져온 다음 위에 아티스트를 한 명 더 '블리트'하는 것입니다. 따라서 저장된 '깨끗한' 비트맵을 관리하면 각 프레임에서 변경되는 소수의 아티스트만 다시 그릴 수 있고 상당한 시간을 절약할 수 있습니다. blitting을 사용할 때( 를 전달하여 blit=True
) 핵심 루프는
FuncAnimation
좀 더 복잡해집니다.
ax = fig.gca()
def update_blit(artists):
fig.canvas.restore_region(bg_cache)
for a in artists:
a.axes.draw_artist(a)
ax.figure.canvas.blit(ax.bbox)
artists = init_func()
for a in artists:
a.set_animated(True)
fig.canvas.draw()
bg_cache = fig.canvas.copy_from_bbox(ax.bbox)
for f in frames:
artists = func(f, *fargs)
update_blit(artists)
fig.canvas.start_event_loop(interval)
이것은 물론 많은 세부 사항(예: 그림의 크기를 조정하거나 완전히 다시 그릴 때 배경 업데이트)을 생략합니다. 그러나 희망적으로 미니멀한 이 예는 '블리팅'이 어떻게 작동하는지에 대한 이론과 init_func
내부 func
에서 어떻게 사용 되는지에 대한 감각을 제공합니다.FuncAnimation
에 예상되는 서명 은 장부 관리 func
및 플로팅 논리에서 제외 init_func
하기가 매우 간단 FuncAnimation
하지만 이는 전달하는 콜러블 객체가 작업해야 하는 아티스트를 알고 있어야 함을 의미합니다. 다양한 복잡성과 캡슐화를 통해 이를 처리하는 몇 가지 접근 방식이 있습니다. 스크립트의 경우 매우 잘 작동하는 가장 간단한 접근 방식은 전역 범위에서 아티스트를 정의하고 Python이 작업을 정렬하도록 하는 것입니다. 예를 들어
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'ro')
def init():
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1, 1)
return ln,
def update(frame):
xdata.append(frame)
ydata.append(np.sin(frame))
ln.set_data(xdata, ydata)
return ln,
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)
plt.show()
두 번째 방법은 functools.partial
아티스트를 기능에 '바인딩'하는 데 사용하는 것입니다. 세 번째 방법은 클로저를 사용하여 필요한 아티스트와 기능을 구축하는 것입니다. 네 번째 방법은 클래스를 만드는 것입니다.
예 #
ArtistAnimation
#
예 #
작가 수업 #
제공된 작성자는 몇 가지 광범위한 범주로 분류됩니다.
Pillow 작성자는 모든 데이터를 메모리에 유지하면서 Pillow 라이브러리를 사용하여 애니메이션을 작성합니다.
HTML 작성기는 JavaScript 기반 애니메이션을 생성합니다.
JavaScript 기반 HTML 영화용 작성자입니다. |
파이프 기반 작성기는 캡처된 프레임을 파이프를 통해 외부 프로세스로 스트리밍합니다. 파이프 기반 변형은 성능이 더 좋은 경향이 있지만 모든 시스템에서 작동하지 않을 수 있습니다.
파이프 기반 ffmpeg 작성기. |
|
파이프 기반 애니메이션 gif. |
파일 기반 작성기는 끝에 단일 파일로 연결되는 각 프레임에 대한 임시 파일을 저장합니다. 느리기는 하지만 이러한 기록기는 디버그하기가 더 쉽습니다.
파일 기반 ffmpeg 작성기. |
|
파일 기반 애니메이션 gif 작성기. |
작성기 클래스는 동일한 기본 에서 순차적 프레임을 가져오는 방법을 제공합니다 Figure
. 모두 순서대로 호출해야 하는 세 가지 메서드를 제공합니다.
setup
작성자를 준비합니다(예: 파이프 열기). 파이프 기반 및 파일 기반 작성기는setup()
.grab_frame
그런 다음 한 번에 단일 프레임을 캡처하는 데 필요한 만큼 자주 호출할 수 있습니다.finish
동영상을 마무리하고 출력 파일을 디스크에 씁니다.
예시:
moviewriter = MovieWriter(...)
moviewriter.setup(fig, 'my_movie.ext', dpi=100)
for j in range(n):
update_figure(j)
moviewriter.grab_frame()
moviewriter.finish()
작성기 클래스를 직접 사용하는 경우(통하지 않음 ) 컨텍스트 관리자 Animation.save
를 사용하는 것이 좋습니다 .saving
with moviewriter.saving(fig, 'myfile.mp4', dpi=100):
for j in range(n):
update_figure(j)
moviewriter.grab_frame()
필요에 따라 설정 및 정리가 수행되도록 합니다.
예 #
도우미 클래스 #
애니메이션 기본 클래스 #
애니메이션의 기본 클래스입니다. |
|
|
작성자 등록 #
Animation.save
작성기 인스턴스 대신 문자열이 전달될 수 있도록 작성기 이름과 클래스 사이를 매핑하기 위해 모듈 수준 레지스트리가 제공됩니다
.
사람이 읽을 수 있는 이름으로 사용 가능한 작성자 클래스의 레지스트리. |
작성기 기본 클래스 #
코드 중복 기본 클래스를 줄이기 위해
동영상 작성을 위한 추상 기본 클래스로, 를 호출하여 프레임을 잡는 방법을 제공합니다 |
|
동영상 작성을 위한 기본 클래스입니다. |
|
|
그리고 믹스인
FFMpeg 출력을 위한 믹스인 클래스. |
|
ImageMagick 출력을 위한 믹스인 클래스. |
제공된다.
MovieWriter
새 클래스 를 쉽게 구현하는 방법은 소스 코드를 참조하십시오 .