Communitygithub.com

애니메이션 인포그래픽

이 스킬은 사용자가 '애니메이션 인포그래픽 만들기', '인포그래픽 비디오 제작', '인포그래픽 애니메이션 구축', '설명 인포그래픽 애니메이션', '아이콘과 통계의 순차적 표시', '주요 숫자와 연결선이 있는 아이콘 애니메이션', '순차적으로 애니메이션되는 디자인된 인포그래픽 레이아웃' 등을 요청할 때 사용됩니다. 인포그래픽 레이아웃 및 시각적 계층, 요소의 순차적 등장, 아이콘/픽토그램 애니메이션, 주요 숫자 카운터, 연결선/흐름, 섹션 템포를 다룹니다. 막대 차트 경주, CSV 기반 차트 등 무거운 차트 작업은 대신 chart-animation 스킬을 사용하세요.

애니메이션 인포그래픽란 무엇인가요?

이 스킬은 정적 디자인을 먼저 완성한 후 애니메이션을 입히는 접근법을 가르칩니다. 핵심은 '정적 프레임을 먼저 디자인하라'는 한 가지 규칙입니다. 즉, 모든 아이콘, 숫자, 레이블을 최종 위치에 배치한 후에야 키프레임을 추가해야 합니다. 애니메이션은 이미 배치된 요소가 *언제* 나타날지만 제어하며, 레이아웃을 결정하지 않습니다. 이는 요소가 원래 의도되지 않은 위치로 날아가 최종 프레임이 부자연스러워지는 일반적인 실수를 방지합니다. 이 스킬은 Remotion을 기본 플랫폼으로 사용하며, 모든 값이 `useCurrentFrame()`의 순수 함수로 구동되어 결정론적 렌더링을 보장합니다. 시각적 계층이 공개 순서를 결정합니다(제목 → 아이콘 → 숫자 → 레이블 → 연결선). 형제 요소 간에는 일관된 스태거(6-10프레임)를 적용하여 순차적인 느낌을 줍니다. 아이콘은 스프링 기반의 '팝' 효과로, 숫자는 부드러운 Easing 함수로 카운트업되며, 연결선은 경로 길이를 따라 그려집니다. 제공되는 스킬 마크다운은 정적 레이아웃 설계, 계층 기반 공개 순서, 스태거 캐스케이드, 아이콘 팝 애니메이션, 숫자 카운터 구현, 연결선 그리기, 섹션별 시간 배분, 산출물 체크리스트, 렌더링된 스틸 이미지를 통한 검증 워크플로우(MP4 인코딩 전)를 상세히 설명합니다. 또한 참조 파일(`references/sequenced-infographic.md`)을 제공하여 세 단계 '작동 방식' 인포그래픽의 완전한 실행 가능 Remotion 예제를 포함합니다. 사용 사례로는 혼합 레이아웃 설명('X의 3단계', '작동 방식', '숫자로 보는', 통계 카드 그리드), 아이콘 + 통계 + 레이블 + 연결선의 순차적 공개, 픽토그램/아이콘 애니메이션, 카운트업 숫자, 단계 간 흐름 연결선 등이 있습니다. 차트 자체가 콘텐츠인 경우(막대 차트 경주, 라인/영역 애니메이션, CSV 기반 그래프)는 **chart-animation** 스킬을 사용하고, 해당 차트를 이 인포그래픽 내에서 하나의 블록으로 구성하는 방식을 권장합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/playlikeboy/videos-skill/tree/HEAD/.claude/skills/animated-infographic

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

애니메이션 인포그래픽은(는) 무엇을 하나요?

디자인된 인포그래픽을 만듭니다. 아이콘, 몇 가지 주요 숫자, 짧은 텍스트, 실제 시각적 계층이 있는 단순한 도형을 배열한 후 순차적으로 애니메이션하여 각 요소가 제 순간을 누리게 합니다. 핵심은 먼저 구도, 그다음 안무입니다. 즉, 정적 레이아웃이 그 자체로 읽히고, 계단식으로 등장하여 시선을 정확히 원하는 곳으로 안내합니다.

사용 시기

  • 혼합 레이아웃 설명: "3단계로 보는 X", "작동 방식", "숫자로 보는", 통계 카드 그리드.
  • 하나의 디자인된 장면에서 아이콘 + 통계 + 레이블 + 연결선의 순차적 공개.
  • 픽토그램/아이콘 애니메이션, 카운트업 주요 숫자, 단계 간 흐름 연결선.

이 스킬은 구성된 인포그래픽을 담당합니다. 차트 자체가 콘텐츠인 경우(막대 차트 경주, 애니메이션 라인/영역, CSV 기반 그래프)는 chart-animation을 사용하고, 해당 차트를 여기서 다시 구축하지 않고 인포그래픽 내부의 한 블록으로 구성하세요.

유일한 규칙: 정적 프레임을 먼저 디자인하라

훌륭한 애니메이션 인포그래픽은 우연히 움직이는 훌륭한 정적 인포그래픽입니다. 단일 키프레임을 추가하기 전에 전체 구도(모든 아이콘, 숫자, 레이블을 최종 위치에)를 배치하고 균형을 맞추세요. 그러면 애니메이션은 이미 배치된 각 요소가 언제 나타날지만 제어하며, 레이아웃을 절대 결정하지 않습니다. 이는 가장 흔한 실패(요소가 원래 디자인되지 않은 위치로 날아가 최종 프레임이 우연처럼 보이는 현상)를 방지합니다.

범위를 엄격하게: 하나의 핵심 인사이트, 3~5개의 보조 데이터 포인트, 30~90초. 다섯 개 이상의 경쟁 요소가 있으면 계단식 공개가 혼란으로 읽힙니다.

시각적 계층 → 공개 순서

공개 순서가 계층입니다. 시선은 나타나는 순서를 따르므로 레이아웃 순서가 아닌 중요도 순서로 요소에 애니메이션을 적용하세요. 각 요소를 계층(tier)에 매핑한 다음 계층별로 공개합니다.

계층요소공개모션
1섹션 제목 / 핵심 인사이트먼저, 단독으로페이드 + 약간 상승
2아이콘 (각 항목 고정)항목별로, 그룹을 이끔팝 / 스케일 오버슈트
3주요 숫자 (카운터)아이콘 직후카운트업, ease-out
4레이블 / 캡션숫자 아래에 안착페이드, 모션 드라마 없음
5연결선 / 흐름선항목이 완료될 때 연결그리기 (경로 길이)

크기, 굵기, 색상은 정적 계층에 사용하고, 타이밍과 모션은 애니메이션 계층에 사용하세요. 한 번에 하나의 강조 요소만 — 두 개의 숫자를 동시에 세지 마세요.

스태거: 계단식 효과

형제 항목을 형제 간 고정 지연(스태거)으로 공개하여 그룹이 한 번에 번쩍이는 것이 아닌 순서 있는 시퀀스로 읽히게 합니다. 모든 요소를 현재 프레임의 순수 함수로 구동하세요(벽시계 시간이나 라이브러리 애니메이션 루프를 사용하지 마세요). 그러면 렌더링이 결정론적입니다.

import { useCurrentFrame, spring, useVideoConfig } from "remotion";

const STAGGER = 8; // 형제 간 프레임 (~30fps에서 ~0.27초)

function Item({ index, children }) {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();
  const local = frame - index * STAGGER;            // 이 항목의 자체 시계
  const enter = spring({ frame: local, fps, config: { damping: 14, mass: 0.6 } });
  return (
    <div style={{ opacity: enter, transform: `translateY(${(1 - enter) * 24}px)` }}>
      {children}
    </div>
  );
}

6~10프레임의 스태거가 산뜻하게 느껴집니다. ~15 이상이면 지루합니다. 모든 형제에 하나의 진입 곡선을 유지하여 계단식이 잡음이 아닌 자신감으로 읽히게 하세요.

아이콘 애니메이션: 팝 효과

아이콘은 각 항목을 고정하므로 가장 강력한 등장(안착되는 스케일 오버슈트, "팝")을 제공하세요. 바운스를 위해 낮은 댐핑의 스프링을 사용하세요. 선형 스케일은 기계적으로 읽힙니다.

const pop = spring({ frame: local, fps, config: { damping: 10, stiffness: 180, mass: 0.5 } });
// pop이 1을 넘어 오버슈트한 후 안착 → 생동감 있음
<g transform={`scale(${pop})`} style={{ transformOrigin: "center" }}>{icon}</g>

픽토그램 채우기의 경우(예: "10명 중 7명"), 동일한 스태거로 단위를 공개하고 마스크를 사용하여 부분 단위를 클리핑하고 스케일링하지 마세요.

주요 숫자: 안착하는 카운터

기본 숫자를 보간(interpolate)하고, 이징(easing)한 다음 렌더링 시 포맷하세요. 두 가지 필수 사항: 포맷 전에 반올림하고, 숫자가 변경될 때 레이아웃이 흔들리지 않도록 tabular-nums를 사용하세요. (chart-animation과 공유하는 기술 — 통화/백분율 변형은 해당 스킬의 카운터 섹션을 참조하세요.)

import { interpolate, Easing } from "remotion";

const raw = interpolate(frame - delay, [0, 30], [0, 1287], {
  extrapolateLeft: "clamp", extrapolateRight: "clamp",
  easing: Easing.out(Easing.cubic),   // "숫자에 안착"
});
const label = new Intl.NumberFormat("en-US").format(Math.round(raw)); // "1,287"
// CSS: font-variant-numeric: tabular-nums; line-height: 1;

헤드라인 숫자에서 ease-out은 도착으로 읽히고, 선형은 로봇 주행계로 읽힙니다. 다음 항목이 시작되기 전에 각 숫자를 약 0.5초 동안 유지하세요.

연결선과 흐름

연결선은 카드 그리드를 프로세스로 만듭니다. 경로를 따라 선/화살표를 애니메이션하여, 가리키는 항목이 완료될 때 도착하도록 동기화하세요. "이제 여길 봐"라고 말하는 모션입니다.

const pathRef = useRef();
const len = pathRef.current?.getTotalLength?.() ?? 0;
const draw = interpolate(frame - delay, [0, 18], [0, 1], { extrapolateRight: "clamp" });
<path ref={pathRef} d="M40,0 C40,30 40,30 40,60" fill="none" stroke="#444" strokeWidth={3}
  strokeDasharray={len} strokeDashoffset={len * (1 - draw)} />

연결선을 연결하는 두 항목 사이에, 소스가 나타난 후 타겟이 나타나기 전의 간격에 그리세요. 선이 시선을 다음 공개로 이끕니다.

섹션 시간 배분

초당 폴리싱 시간이 아닌 요소당 시간을 예산하세요. 시청자는 한 번에 하나의 움직이는 대상만 추적할 수 있습니다.

비트예산
제목 유지 (안착될 때까지)0.8~1.2초
항목당 (아이콘 팝 → 카운터 → 레이블)1.2~2.0초
연결선 그리기0.4~0.6초, 다음 항목과 겹침
최종 구성 유지 (스크린샷 가능)2~3초

완전한 정적 인포그래픽을 2~3초 동안 멈춰서 끝냅니다. 핵심은 조립된 프레임이므로 경쟁 모션 없이 안착시키세요.

출력 체크리스트

  • 키프레임 전에 정적 레이아웃을 디자인하고 균형을 맞춤; 유지된 최종 프레임이 의도적으로 보임.
  • 하나의 핵심 인사이트, 35개 데이터 포인트, 3090초.
  • 공개 순서가 레이아웃 순서가 아닌 계층을 따름(제목 → 아이콘 → 숫자 → 레이블 → 연결선).
  • 형제 요소가 일관된 6~10프레임 스태거와 하나의 진입 곡선으로 계단식 공개됨.
  • 아이콘은 스프링 오버슈트로 팝; 숫자는 ease-out + tabular-nums로 카운트업; 한 번에 하나의 숫자만 애니메이션.
  • 연결선은 시선을 다음 공개로 이끌기 위해 그려짐.
  • 모든 값은 useCurrentFrame()의 순수 함수; 라이브러리 타이머 없음.
  • 최종 구성 프레임이 ≥2초 동안 유지됨.

전달 및 검증 (렌더링된 스틸 → MP4)

패키지된 도우미 (scripts/): scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png로 스틸을 타일링한 다음, scripts/probe-mp4.sh out.mp4 [WxH] [fps]로 인코딩을 확인하세요. scripts/README.md를 참조하세요.

Remotion은 프레임 결정론적입니다. 모든 아이콘 팝, 카운터 값, 연결선 그리기는 useCurrentFrame()의 순수 함수이므로 시크 도구 없이 모든 정확한 프레임을 헤드리스로 렌더링할 수 있습니다. 인포그래픽은 주요 숫자를 전달하므로 스틸 검사를 통해 잘못된 통계나 오프캔버스에 있는 스태거를 인코딩 낭비 전에 잡아낼 수 있습니다.

출력 계약:

  • 장면이 등록된 Remotion 프로젝트(<Composition> + zod schema + defaultProps), 모든 모션은 프레임 기반(타이머 / Date.now() / Math.random() 없음).
  • 전달물 = 렌더링된 out/*.mp4 (프로젝트도 포함하므로 사용자가 새 통계/아이콘으로 다시 렌더링 가능).
  • 지속 시간이 데이터에 의존적(N개 항목 × 항목당 예산)? calculateMetadata에서 계산하고 수동으로 하지 마세요.

검증 루프 — 스틸 렌더링 → 검사 → 인코딩. 먼저 단일 프레임을 렌더링(저렴함, 비디오 인코딩 없음)한 다음 레이아웃과 숫자가 올바를 때만 인코딩하세요.

# 1. 프레임 정확한 스틸 — SHIPPED props 사용. 각 계층을 잡는 프레임 선택:
npx remotion still Infographic out/f-title.png --frame=20  --props='{"items":[...]}'  # 제목 + 첫 번째 팝
npx remotion still Infographic out/f-mid.png   --frame=90  --props='{"items":[...]}'  # 중간 계단식
npx remotion still Infographic out/f-end.png   --frame=149 --props='{"items":[...]}'  # 최종 구성 유지 (= durationInFrames - 1)

# 2. 각 PNG 검사 — 충실도(모든 주요 숫자 정확, 레이블/캡션 올바름, 아이콘이 올바른 글리프)
#    및 아티팩트(텍스트 넘침, 아이콘 오프캔버스, 안전 영역 클리핑, 누락된 글꼴, 연결선이 잘못된 항목을 가리킴,
#    계층이 안착되어야 할 때 반쯤 공개된 요소).

# 3. 스틸 검사가 통과된 후에만 인코딩:
npx remotion render Infographic out/infographic.mp4 --props='{"items":[...]}'
  • npx remotion compositions를 사용하여 durationInFrames/fps를 읽으세요. 최종 구성 유지가 가장 중요한 프레임입니다. 의도적으로 보이는지, 중간 계단식이 아닌지 확인하세요.
  • 데이터 기반 / 배치: 모든 변형을 배치 렌더링하기 전에 하나의 대표 props 세트(통계 + 레이블)를 스틸로 검증하세요. 카운터나 레이아웃 버그를 한 번 잡으면 N번 잡지 않아도 됩니다.
  • README 데모 GIF 무료: npx remotion render Infographic out/demo.gif --codec=gif.

마치기 전에:

  1. npx remotion still이 제목, 중간 계단식, 최종 유지에서 깔끔하게 렌더링됨 — 오류, 누락된 글꼴/아이콘 없음.
  2. 모든 주요 숫자가 정확(반올림, tabular-nums)하고 각 프레임에서 모든 요소가 안전 영역 내부에 있음.
  3. 프레임 기반만 사용 — Date.now() / Math.random() / 라이브러리 타이머 없음(CI에서 결정론 유지).
  4. 배송된 props가 올바르게 렌더링됨(defaultProps뿐만 아니라) — 올바른 통계, 올바른 아이콘, 올바른 레이블.
  5. 전체 MP4 인코딩되어 재생됨; (선택 사항) README용 GIF 렌더링.

참조 파일

  • references/sequenced-infographic.md — 완전히 실행 가능한 Remotion 장면: 지연된 아이콘 팝, 이징된 카운트업 통계, 그리기 연결선, 마스터 타이밍 맵, 데이터 기반으로 만들기(템플릿 × 데이터) props 패턴을 갖춘 3단계 "작동 방식" 인포그래픽. 비Remotion 사용을 위한 종속성 없는 인라인 SVG 변형 포함.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

관련 스킬