Skip to content

render_project_script 결과가 프로젝트에 반영되지 않음 + nature 테마 bbox=tight 로 물리 폭 변동 + 좁은 log 축 minor tick 라벨 겹침 #232

Description

@moonweave

요약

render_project_script 를 쓰는 과정에서 사용자가 잘못된 파일을 정본으로 오인하게 만드는 동작 3건.

환경: figops MCP surface v2, figops.healthversion: "unknown", runtime_root ~/Library/Caches/FigOps.


(1) ★ 렌더 결과가 프로젝트에 반영되지 않는다 (가장 위험)

재현

figops.render_project_script(project_path="<프로젝트>", figure_id=...,
                             style_policy="nature", overwrite=true)

project_config.yaml 의 선언:

figures:
  - id: Fig2_ChargeTransport_4panel
    output: "results/figures/fig2_charge_transport/fig2_...png"

관측값

응답의 artifact.relative_pathproject/results/figures/... 이고, 실제 파일은

~/Library/Caches/FigOps/mcp_project_jobs/<job_id>/project/results/figures/...

에만 생긴다. 원본 프로젝트 디렉토리의 output 경로는 갱신되지 않는다.

overwrite: true 를 줘도 마찬가지다. 이 인자가 무엇을 대상으로 하는지 불분명하다.

실제로 일어난 사고

같은 스크립트를 로컬에서 한 번 직접 실행한 적이 있어 프로젝트 경로에 구 버전 PNG 가 남아 있었다. 이후 figops 로 3회 렌더(b/c/d)하며 레이아웃을 고쳤는데, 프로젝트 파일은 계속 첫 로컬 실행본이었다.

  • 프로젝트 파일: sha 75920f8e, 4251×2929 px, 00:38:02
  • job-d 산출물: sha 90184748, 4247×2969 px, 00:41:41

응답의 sha 와 디스크의 sha 를 대조하기 전까지 알아채지 못했다. 렌더 결과를 확인했다고 믿고 검수까지 마친 상태였다.

제안

  • 렌더 성공 시 job 산출물을 프로젝트의 output 경로로 반영하거나, 최소한 응답에 절대경로를 함께 반환할 것
  • 반영하지 않는 것이 의도라면, 응답 요약에 "프로젝트 파일은 변경되지 않았다"를 명시할 것
  • overwrite 인자의 대상이 job 워크스페이스인지 프로젝트인지 문서화

(2) nature 테마가 savefig.bbox="tight" 를 켜서 물리 치수가 흔들린다

apply_journal_theme(target_format="nature") 후 rcParams:

savefig.bbox = tight

figsize 로 180 mm 를 지정해도 tight 가 여백을 잘라 실제 폭이 매번 달라진다. 같은 figure 를 라벨만 바꿔 렌더한 결과:

job 폭 (mm) 픽셀
d 179.79 4247×2969
e 179.79 4257×2969
f 178.60 4219×2966

투고 규격은 폭을 고정해야 하는데(단단 88 / 양단 180 mm), 라벨 길이에 따라 폭이 바뀐다.

save_journal_fig docstring 에 "layout-locked figures use rc_context to suppress tight" 라고 되어 있으나, GridSpec 에 절대 마진(left/right/top/bottom)을 준 figure 는 layout-locked 로 인식되지 않았다 (artists_outside_figurelayout_locked: false).

제안

  • 저널 타깃에서는 bbox="standard" 를 기본으로 하고, tight 는 opt-in 으로
  • 또는 apply_journal_themelayout_locked=True 인자를 노출해 사용자가 명시할 수 있게

(3) log 축 구간이 좁으면 minor tick 라벨이 전부 켜져 겹친다

x 범위 28–338 s (약 1.08 decade) 인 log 축에서 라벨이 이렇게 나온다:

3×10¹  4×10¹  6×10¹  10²  2×10²  3×10²

180 mm 폭의 3열 배치에서 각 패널 플롯이 약 43 mm 인데, 6개 라벨이 겹쳐 3×10¹4×10¹ 이 붙어 3×10⁴ 처럼 읽힌다.

matplotlib 의 LogFormatterSciNotation 기본 동작이지만, 저널 테마라면 좁은 패널에서 이를 억제하는 것이 맞다고 본다. 사용자가 매번 아래를 직접 넣어야 한다:

axd.xaxis.set_major_locator(FixedLocator([30, 100, 300]))
axd.xaxis.set_major_formatter(FixedFormatter(["30", "100", "300"]))
axd.xaxis.set_minor_formatter(NullFormatter())

또한 tick_label_overlaps[axis=3] 은 이 상태에서 빈 배열(겹침 없음) 을 보고했다 — minor tick 라벨이 검사 대상에서 빠진 것으로 보인다. (#230 의 진단 정확도 이슈와 연관)

제안

  • 저널 프로파일에서 축 범위가 2 decade 미만이면 minor tick 라벨을 기본 억제
  • tick_label_overlaps 검사에 minor tick 라벨 포함

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions