> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-docs-sandboxes-integrations-placement.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> App UI에서 대화형으로 또는 W&B SDK를 사용해 프로그래밍 방식으로 리포트를 편집합니다.

# 리포트 편집

<Note>
  W\&B Report and Workspace API는 공개 프리뷰 상태입니다.
</Note>

이 페이지에서는 App UI에서 대화형으로 또는 W\&B SDK를 사용해 프로그래밍 방식으로 리포트를 편집하는 방법을 설명합니다. 플롯, run 세트, 코드 블록, 마크다운, HTML 요소, 리치 미디어를 추가하는 방법을 다룹니다. 또한 run 세트를 필터링하고 그룹화하는 방법, 리포트 레이아웃을 구성하는 방법, 다차원 관계를 시각화하는 방법도 다룹니다.

리포트 본문은 *블록* 으로 구성됩니다. 블록에는 텍스트, 이미지, 임베드된 시각화, Experiments 및 Runs의 플롯, 그리고 패널 그리드가 포함됩니다.

*패널 그리드* 는 패널과 *run 세트* 를 담는 특정 유형의 블록입니다. Run 세트는 W\&B의 프로젝트에 로깅된 run의 컬렉션입니다. 패널은 run 세트 데이터의 시각화입니다.

<Note>
  사용자 지정된 저장 워크스페이스 뷰를 만드는 엔드 투 엔드 튜토리얼을 보려면 [Programmatic workspaces notebook](https://colab.research.google.com/github/wandb/wandb-workspaces/blob/Update-wandb-workspaces-tuturial/Workspace_tutorial.ipynb)을 실행하세요.
</Note>

<Note>
  리포트를 프로그래밍 방식으로 편집하려면 W\&B Python SDK와 함께 W\&B Report and Workspace API (`wandb-workspaces`)를 설치해야 합니다:

  ```bash theme={null}
  pip install wandb wandb-workspaces
  ```
</Note>

<div id="add-plots">
  ## 플롯 추가
</div>

플롯을 사용하면 리포트 내에서 run 데이터를 시각화할 수 있습니다. 각 패널 그리드는 run 세트와 패널 세트로 구성됩니다. 패널 그리드의 run 세트는 그리드에 있는 패널에 어떤 데이터가 표시될지 제어합니다. 다른 run 세트에서 데이터를 가져오는 차트를 추가하려면 새 패널 그리드를 생성하세요.

<Tabs>
  <Tab title="App UI">
    리포트에서 슬래시(`/`)를 입력하면 드롭다운 메뉴가 표시됩니다. 패널을 추가하려면 **Add panel**을 선택합니다. 라인 플롯(line plot), 산점도(scatter plot), 평행 좌표(parallel coordinates) 차트 등 W\&B에서 지원하는 모든 패널을 추가할 수 있습니다.

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/demo_report_add_panel_grid.gif?s=5b82e251270e74f41652b6902e990ec8" alt="리포트에 차트 추가" width="1652" height="1498" data-path="images/reports/demo_report_add_panel_grid.gif" />
    </Frame>
  </Tab>

  <Tab title="Report and Workspace API">
    SDK를 사용해 프로그래밍 방식으로 리포트에 플롯을 추가할 수 있습니다. 하나 이상의 플롯 또는 차트 객체 목록을 `PanelGrid` Public API 클래스의 `panels` 파라미터에 전달합니다. 관련 Python 클래스와 함께 플롯 또는 차트 객체를 생성합니다.

    아래 예제는 라인 플롯과 산점도를 생성하는 방법을 보여줍니다.

    ```python theme={null}
    import wandb
    import wandb_workspaces.reports.v2 as wr

    report = wr.Report(
        project="report-editing",
        title="Report title",
        description="Report description.",
    )

    blocks = [
        wr.PanelGrid(
            panels=[
                wr.LinePlot(x="time", y="velocity"),
                wr.ScatterPlot(x="time", y="acceleration"),
            ]
        )
    ]

    report.blocks = blocks
    report.save()
    ```

    프로그래밍 방식으로 리포트에 추가할 수 있는 플롯과 차트에 대한 자세한 내용은 `wr.panels`를 참조하세요.
  </Tab>
</Tabs>

<div id="add-run-sets">
  ## run 세트 추가
</div>

App UI 또는 W\&B SDK를 사용해 프로젝트에서 run 세트를 대화형으로 추가합니다.

<Tabs>
  <Tab title="App UI">
    리포트에서 슬래시(`/`)를 입력하면 드롭다운 메뉴가 표시됩니다. 드롭다운에서 **Panel Grid**를 선택합니다. W\&B가 리포트가 생성된 프로젝트의 run 세트를 자동으로 가져옵니다.

    패널을 리포트에 가져오면 리포트는 프로젝트의 run 이름을 상속합니다. 리포트에서 독자가 더 잘 이해할 수 있도록 필요하다면 [run 이름 바꾸기](/ko/models/runs/#rename-a-run)를 할 수 있습니다. 이 이름 변경은 해당 개별 패널에만 적용됩니다. 동일한 리포트에서 패널을 복제하면, 복제된 패널에도 새 이름이 반영됩니다.

    1. 리포트에서 연필 아이콘을 클릭해 리포트 편집기를 엽니다.

    2. run 세트에서 이름을 변경할 run을 찾습니다. run 이름 위에 마우스를 올린 다음 **액션 (<Icon icon="ellipsis-vertical" iconType="solid" />)** 메뉴를 클릭합니다. 다음 선택지 중 하나를 선택한 뒤, 폼을 제출합니다.

       * **Rename run for project**: 전체 프로젝트에 걸쳐 run 이름을 변경합니다. 새 임의 이름을 생성하려면 필드를 비워 둡니다.
       * **Rename run for panel grid**: 다른 컨텍스트에서 기존 이름은 유지한 채, 이 리포트에서만 run 이름을 변경합니다. 이 옵션으로는 새 임의 이름을 생성할 수 없습니다.

    3. **Publish report**를 클릭합니다.
  </Tab>

  <Tab title="Report and Workspace API">
    `wr.Runset()` 및 `wr.PanelGrid` 클래스를 사용해 프로젝트에서 run 세트를 추가합니다. run 세트를 추가하려면 다음 단계를 따르세요.

    1. `wr.Runset()` 객체 인스턴스를 생성합니다. `project` 매개변수에는 run 세트를 포함하는 프로젝트 이름을, `entity` 매개변수에는 해당 프로젝트를 소유한 엔터티를 제공합니다.
    2. `wr.PanelGrid()` 객체 인스턴스를 생성합니다. 하나 이상의 run 세트 객체 목록을 `runsets` 매개변수에 전달합니다.
    3. 하나 이상의 `wr.PanelGrid()` 객체 인스턴스를 리스트에 저장합니다.
    4. 패널 그리드 인스턴스 리스트로 리포트 인스턴스의 `blocks` 속성을 업데이트합니다.

    다음 예시에서는 `[PROJECT-NAME]`을 W\&B 프로젝트 이름으로, `[ENTITY-NAME]`을 W\&B 엔터티 이름으로 바꾸세요.

    ```python theme={null}
    import wandb
    import wandb_workspaces.reports.v2 as wr

    report = wr.Report(
        project="report-editing",
        title="Report title",
        description="Report description.",
    )

    panel_grids = wr.PanelGrid(
        runsets=[wr.RunSet(project="[PROJECT-NAME]", entity="[ENTITY-NAME]")]
    )

    report.blocks = [panel_grids]
    report.save()
    ```

    원한다면 한 번의 SDK 호출로 runset과 패널을 함께 추가할 수도 있습니다.

    ```python theme={null}
    import wandb

    report = wr.Report(
        project="report-editing",
        title="Report title",
        description="Report description.",
    )

    panel_grids = wr.PanelGrid(
        panels=[
            wr.LinePlot(
                title="line title",
                x="x",
                y=["y"],
                range_x=[0, 100],
                range_y=[0, 100],
                log_x=True,
                log_y=True,
                title_x="x axis title",
                title_y="y axis title",
                ignore_outliers=True,
                groupby="hyperparam1",
                groupby_aggfunc="mean",
                groupby_rangefunc="minmax",
                smoothing_factor=0.5,
                smoothing_type="gaussian",
                smoothing_show_original=True,
                max_runs_to_show=10,
                plot_type="stacked-area",
                font_size="large",
                legend_position="west",
            ),
            wr.ScatterPlot(
                title="scatter title",
                x="y",
                y="y",
                # z='x',
                range_x=[0, 0.0005],
                range_y=[0, 0.0005],
                # range_z=[0,1],
                log_x=False,
                log_y=False,
                # log_z=True,
                running_ymin=True,
                running_ymean=True,
                running_ymax=True,
                font_size="small",
                regression=True,
            ),
        ],
        runsets=[wr.RunSet(project="[PROJECT-NAME]", entity="[ENTITY-NAME]")],
    )


    report.blocks = [panel_grids]
    report.save()
    ```
  </Tab>
</Tabs>

<div id="freeze-a-run-set">
  ## run 세트 고정하기
</div>

리포트는 프로젝트의 최신 데이터를 표시하기 위해 run 세트를 자동으로 업데이트합니다. 나중에 추가되는 run으로 인해 리포트에 표시되는 내용이 바뀌지 않도록, 특정 시점의 상태를 리포트에 보존하려면 run 세트를 고정하세요.

리포트 화면에서 run 세트를 고정하려면 패널 그리드에서 **Filter** 버튼 근처에 있는 눈송이 아이콘을 클릭합니다.

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/freeze_runset.png?fit=max&auto=format&n=gsiJ_BEkjRzibnDO&q=85&s=42e57d9056a501526b0c243f5fb05208" alt="run 세트 고정 버튼" width="1799" height="552" data-path="images/reports/freeze_runset.png" />
</Frame>

<div id="group-a-run-set-programmatically">
  ## run 세트를 프로그래밍 방식으로 그룹화하기
</div>

[Workspace and Reports API](/ko/models/ref/wandb_workspaces/reports)를 사용해 run 세트의 run들을 프로그래밍 방식으로 그룹화할 수 있습니다. 그룹화하면 관련 run들이 패널에 함께 정리되어 설정과 결과를 더 쉽게 비교할 수 있습니다.

run 세트의 run들을 설정 값, run 메타데이터, 또는 summary 메트릭 기준으로 그룹화할 수 있습니다. 다음 표는 사용 가능한 그룹화 방법과 각 방법에서 사용할 수 있는 키를 보여줍니다:

| Grouping method | Description            | Available keys                            |
| --------------- | ---------------------- | ----------------------------------------- |
| Config values   | 설정 값으로 run을 그룹화        | `wandb.init(config=)`의 config 파라미터에 지정한 값 |
| Run metadata    | run 메타데이터로 run을 그룹화    | `State`, `Name`, `JobType`                |
| Summary metrics | summary 메트릭으로 run을 그룹화 | `wandb.Run.log()`으로 run에 기록하는 값           |

<div id="group-runs-by-config-values">
  ### 설정 값으로 run 그룹화하기
</div>

유사한 설정을 가진 run을 비교하려면 설정 값으로 run을 그룹화한다. 설정 값은 run 설정 `(wandb.init(config=))` 에서 지정하는 파라미터이다. run을 설정 값으로 그룹화하려면 `config.[KEY]` 문법을 사용한다. 여기서 `[KEY]` 는 그룹화에 사용할 설정 값의 이름이다.

예를 들어, 다음 코드 스니펫은 먼저 `group` 에 대한 설정 값을 사용해 run을 초기화한 다음, 리포트에서 `group` 설정 값을 기준으로 run을 그룹화한다. `[ENTITY]` 와 `[PROJECT]` 값은 자신의 W\&B entity 및 프로젝트 이름으로 교체한다.

```python theme={null}
import wandb
import wandb_workspaces.reports.v2 as wr

entity = "[ENTITY]"
project = "[PROJECT]"

for group in ["control", "experiment_a", "experiment_b"]:
    for i in range(3):
        with wandb.init(entity=entity, project=project, group=group, config={"group": group, "run": i}, name=f"{group}_run_{i}") as run:
            # 트레이닝을 간단히 시뮬레이션
            for step in range(100):
                run.log({
                    "acc": 0.5 + (step / 100) * 0.3 + (i * 0.05),
                    "loss": 1.0 - (step / 100) * 0.5
                })
```

Python 스크립트나 노트북 내에서 `config.group` 값을 기준으로 run을 그룹화할 수 있습니다:

```python theme={null}
runset = wr.Runset(
  project=project,
  entity=entity,
  groupby=["config.group"]  # "group" 설정 값으로 그룹화
)
```

앞의 예제에 이어, 그룹화된 run 세트를 사용해 리포트를 생성할 수 있습니다:

```python theme={null}
report = wr.Report(
  entity=entity,
  project=project,
  title="Grouped Runs Example",
)

report.blocks = [
  wr.PanelGrid(
      runsets=[runset],
          )
      ]

report.save()
```

<div id="group-runs-by-run-metadata">
  ### run 메타데이터별로 Runs 그룹화하기
</div>

메타데이터를 기준으로 Runs를 그룹화하면 로깅된 값이 아니라 run 자체의 고유 속성을 기준으로 정리할 수 있습니다.

run의 이름(`Name`), 상태(`State`), 또는 job 유형(`JobType`)별로 Runs를 그룹화할 수 있습니다.

이전 예시에서 이어서, 다음 코드 스니펫을 사용해 Runs를 이름 기준으로 그룹화할 수 있습니다:

```python theme={null}
runset = wr.Runset(
  project=project,
  entity=entity,
  groupby=["Name"]  # run 이름으로 그룹화
)
```

<Note>
  run의 이름은 `wandb.init(name=)` 파라미터에 지정한 이름입니다. 이름을 지정하지 않으면, W\&B가 해당 run에 대해 임의의 이름을 생성합니다.

  run의 이름은 W\&B App에서 해당 run의 **Overview** 페이지에서 확인하거나, `Api.runs().run.name`을 사용해 프로그램 코드에서 확인할 수 있습니다.
</Note>

<div id="group-runs-by-summary-metrics">
  ### summary 메트릭으로 runs 그룹화하기
</div>

다음 예시는 runs를 summary 메트릭으로 그룹화하는 방법을 보여줍니다. summary 메트릭은 `wandb.Run.log()`를 사용해 run에 로그로 기록하는 값입니다. run을 기록한 후에는 W\&B App에서 해당 run의 **Overview** 페이지에 있는 **Summary** 섹션에서 summary 메트릭의 이름을 확인할 수 있습니다.

summary 메트릭으로 runs를 그룹화하는 구문은 `summary.[KEY]`이며, 여기서 `[KEY]`는 그룹화에 사용할 summary 메트릭의 이름입니다.

예를 들어, `acc`라는 이름의 summary 메트릭을 기록한다고 가정해 보겠습니다. `[ENTITY]` 및 `[PROJECT]`를 사용 중인 W\&B entity 및 프로젝트 이름으로 바꾸세요:

```python theme={null}
import wandb
import wandb_workspaces.reports.v2 as wr

entity = "[ENTITY]"
project = "[PROJECT]"

for group in ["control", "experiment_a", "experiment_b"]:
    for i in range(3):
        with wandb.init(entity=entity, project=project, group=group, config={"group": group, "run": i}, name=f"{group}_run_{i}") as run:
            # 트레이닝을 시뮬레이션합니다
            for step in range(100):
                run.log({
                    "acc": 0.5 + (step / 100) * 0.3 + (i * 0.05),
                    "loss": 1.0 - (step / 100) * 0.5
                })

```

그런 다음 `summary.acc` summary 메트릭을 기준으로 run을 그룹화할 수 있습니다:

```python theme={null}
runset = wr.Runset(
  project=project,
  entity=entity,
  groupby=["summary.acc"]  # 요약 값으로 그룹화
)
```

<div id="filter-a-run-set-programmatically">
  ## 프로그래밍 방식으로 run 세트 필터링하기
</div>

[Workspace and Reports API](/ko/models/ref/wandb_workspaces/reports)를 사용해 프로그래밍 방식으로 run 세트를 필터링하고 리포트에 추가하세요. 필터링하면 설정 값, 메트릭, 태그 또는 run 속성을 기준으로 run 세트를 표시하려는 특정 run으로 좁힐 수 있습니다.

필터 표현식의 일반적인 구문은 다음과 같습니다.

```text theme={null}
Filter('[KEY]') operation [VALUE]
```

이 표현식에서 `[KEY]`는 필터 이름이고, `operation`은 비교 연산자(예: `>`, `<`, `==`, `in`, `not in`, `or`, `and`)이며, `[VALUE]`는 비교 대상 값입니다. `Filter`는 적용하려는 필터 유형을 나타내는 자리 표시자입니다. 다음 표에는 사용 가능한 필터와 해당 설명이 나와 있습니다.

| Filter                   | 설명                | 사용 가능한 키                                        |
| ------------------------ | ----------------- | ----------------------------------------------- |
| `Config('[KEY]')`        | 설정 값으로 필터링        | `wandb.init(config=)`의 `config` 매개변수에 지정한 값입니다. |
| `SummaryMetric('[KEY]')` | summary 메트릭으로 필터링 | `wandb.Run.log()`를 사용해 run에 기록한 값입니다.           |
| `Tags('[KEY]')`          | tags로 필터링         | run에 추가한 태그 값입니다(프로그래밍 방식 또는 W\&B App 사용).      |
| `Metric('[KEY]')`        | run 속성으로 필터링      | `tags`, `state`, `displayName`, `jobType`       |

필터를 정의한 후에는 report를 만들고 필터링된 run 세트를 `wr.PanelGrid(runsets=)`에 전달할 수 있습니다. report에 여러 요소를 프로그래밍 방식으로 추가하는 방법에 대한 자세한 내용은 이 페이지 전반의 **Report and Workspace API** 탭을 참조하세요.

다음 예시는 report에서 run 세트를 필터링하는 방법을 보여줍니다. 대괄호로 묶인 값(예: `[ENTITY]` 및 `[PROJECT]`)은 실제 값으로 바꾸세요.

<div id="config-filters">
  ### 설정 필터
</div>

하나 이상의 설정 값으로 run 세트를 필터링합니다. 설정 값은 run 설정(`wandb.init(config=)`)에서 지정하는 파라미터입니다.

예를 들어, 다음 코드 스니펫에서는 먼저 `learning_rate`와 `batch_size` 설정 값으로 run을 초기화한 다음, 리포트에서 `learning_rate` 설정 값을 기준으로 Runs를 필터링합니다.

```python theme={null}
import wandb

config = {
    "learning_rate": 0.01,
    "batch_size": 32,
}

with wandb.init(project="[PROJECT]", entity="[ENTITY]", config=config) as run:
    # 트레이닝 코드를 여기에 작성하세요
    pass
```

Python 스크립트나 노트북에서 학습률이 `0.01`보다 큰 run만 코드로 필터링할 수 있습니다.

```python theme={null}
import wandb_workspaces.reports.v2 as wr

runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="Config('learning_rate') > 0.01"
)
```

`and` 연산자를 사용하여 여러 config 값을 기준으로 필터링할 수도 있습니다:

```python theme={null}
runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="Config('learning_rate') > 0.01 and Config('batch_size') == 32"
)
```

앞선 예시에서 이어서, 필터링된 run 세트를 사용하여 다음과 같이 리포트를 생성할 수 있습니다:

```python theme={null}
report = wr.Report(
  entity="[ENTITY]",
  project="[PROJECT]",
  title="My Report"
)

report.blocks = [
  wr.PanelGrid(
      runsets=[runset],
      panels=[
          wr.LinePlot(
              x="Step",
              y=["accuracy"],
          )
      ]
  )
]

report.save()
```

<div id="metric-filters">
  ### 메트릭 필터
</div>

run 세트를 각 run의 태그(`tags`), run 상태(`state`), run 이름(`displayName`), 또는 job 타입(`jobType`)을 기준으로 필터링한다.

<Note>
  `Metric` 필터는 다른 필터와 다른 구문을 사용한다. 값은 반드시 리스트로 전달해야 한다.

  ```text theme={null}
  Metric('[KEY]') operation [VALUE]
  ```
</Note>

예를 들어, 다음 Python 코드 조각은 세 개의 run을 생성하고 각각에 이름을 지정한다.

```python theme={null}
import wandb

with wandb.init(project="[PROJECT]", entity="[ENTITY]") as run:
    for i in range(3):
        run.name = f"run{i+1}"
        # 트레이닝 코드를 여기에 작성하세요
        pass
```

리포트를 생성할 때 run의 표시 이름으로 run 목록을 필터링할 수 있습니다. 예를 들어 이름이 `run1`, `run2`, `run3`인 run만 필터링하려면 다음 코드를 사용할 수 있습니다:

```python theme={null}
runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="Metric('displayName') in ['run1', 'run2', 'run3']"
)
```

<Note>run의 이름은 W\&B App에서 해당 run의 **Overview** 페이지에서 확인하거나, 프로그래밍 방식으로 `Api.runs().run.name`을 사용해 가져올 수 있습니다.</Note>

다음 예시는 run의 상태(`finished`, `crashed`, 또는 `running`)에 따라 run 세트를 필터링하는 방법을 보여줍니다:

```python theme={null}
runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="Metric('state') in ['finished']"
)
```

```python theme={null}
runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="Metric('state') not in ['crashed']"
)
```

<div id="summarymetric-filters">
  ### SummaryMetric 필터
</div>

정확도 또는 loss 값과 같이 특정 결과 임계값을 충족하는 run에 집중할 수 있도록 summary 메트릭을 기준으로 run 세트를 필터링하세요. Summary 메트릭은 `wandb.Run.log()`을 사용해 run에 기록한 값이다. run을 로깅한 후에는 W\&B App에서 해당 run의 **Overview** 페이지에 있는 **Summary** 섹션에서 Summary 메트릭의 이름을 확인할 수 있다.

```python theme={null}
runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="SummaryMetric('accuracy') > 0.9"
)
```

```python theme={null}
runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="Metric('state') in ['finished'] and SummaryMetric('train/train_loss') < 0.5"
)
```

<div id="tags-filters">
  ### 태그 필터
</div>

특정 태그가 지정된 runs만 표시하려면 태그로 run 세트를 필터링하세요. 태그는 run에 프로그램적으로 또는 W\&B App을 사용해 추가하는 값입니다.

```python theme={null}
runset = wr.Runset(
  entity="[ENTITY]",
  project="[PROJECT]",
  filters="Tags('training') == 'training'"
)
```

<div id="add-code-blocks">
  ## 코드 블록 추가
</div>

결과와 함께 설정, 예시 또는 스니펫을 공유할 수 있도록 코드 블록을 추가하세요. App UI에서 대화형으로 추가하거나 W\&B SDK를 사용해 프로그래밍 방식으로 추가할 수 있습니다.

<Tabs>
  <Tab title="App UI">
    리포트에서 슬래시(`/`)를 입력하면 드롭다운 메뉴가 표시됩니다. 드롭다운에서 **Code**를 선택합니다.

    코드 블록에서 프로그래밍 언어 이름을 선택하면 드롭다운이 펼쳐집니다. 이 드롭다운에서 사용할 프로그래밍 언어 구문을 선택합니다. JavaScript, Python, CSS, JSON, HTML, Markdown, YAML 중에서 선택할 수 있습니다.
  </Tab>

  <Tab title="Report and Workspace API">
    `wr.CodeBlock` 클래스를 사용해 코드 블록을 프로그래밍 방식으로 생성합니다. `language`와 `code` 파라미터에 각각 표시하려는 언어 이름과 코드를 전달합니다.

    다음 예시는 YAML 파일의 리스트를 보여줍니다:

    ```python theme={null}
    import wandb
    import wandb_workspaces.reports.v2 as wr

    report = wr.Report(project="report-editing")

    report.blocks = [
        wr.CodeBlock(
            code=["this:", "- is", "- a", "cool:", "- yaml", "- file"], language="yaml"
        )
    ]

    report.save()
    ```

    위 코드는 다음과 유사한 코드 블록으로 렌더링됩니다:

    ```yaml theme={null}
    this:
    - is
    - a
    cool:
    - yaml
    - file
    ```

    다음 예시는 Python 코드 블록을 보여줍니다:

    ```python theme={null}
    report = wr.Report(project="report-editing")


    report.blocks = [wr.CodeBlock(code=["Hello, World!"], language="python")]

    report.save()
    ```

    위 코드는 다음과 유사한 코드 블록으로 렌더링됩니다:

    ```md theme={null}
    Hello, World!
    ```
  </Tab>
</Tabs>

<div id="add-markdown">
  ## 마크다운 추가
</div>

리포트의 서술형 텍스트, 제목, 인라인 강조에 서식을 적용하려면 마크다운을 추가하세요. App UI 또는 W\&B SDK를 사용해 리포트에 마크다운을 대화형으로 추가하거나 프로그래밍 방식으로 추가할 수 있습니다.

<Tabs>
  <Tab title="App UI">
    리포트에서 슬래시(`/`)를 입력하면 드롭다운 메뉴가 표시됩니다. 드롭다운에서 **Markdown**을 선택합니다.
  </Tab>

  <Tab title="Report and Workspace API">
    `wr.MarkdownBlock` 클래스를 사용해 프로그래밍 방식으로 마크다운 블록을 생성합니다. 문자열을 `text` 파라미터에 전달합니다:

    ```python theme={null}
    import wandb
    import wandb_workspaces.reports.v2 as wr

    report = wr.Report(project="report-editing")

    report.blocks = [
        wr.MarkdownBlock(text="Markdown cell with *italics* and **bold** and $e=mc^2$")
    ]
    ```

    그러면 다음과 비슷한 마크다운 블록이 렌더링됩니다:

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/markdown.png?fit=max&auto=format&n=gsiJ_BEkjRzibnDO&q=85&s=56eca39c8955628abc78bd939bec7aec" alt="렌더링된 마크다운 블록" width="1000" height="178" data-path="images/reports/markdown.png" />
    </Frame>
  </Tab>
</Tabs>

<div id="add-html-elements">
  ## HTML 요소 추가
</div>

헤딩과 목록 같은 HTML 요소를 추가해 리포트를 구조화할 수 있습니다. App UI를 사용해 대화형으로 추가하거나 W\&B SDK를 사용해 프로그래밍 방식으로 추가할 수 있습니다.

<Tabs>
  <Tab title="App UI">
    리포트에서 슬래시(`/`)를 입력하면 드롭다운 메뉴가 표시됩니다. 드롭다운에서 텍스트 블록 유형을 선택합니다. 예를 들어 H2 헤딩 블록을 만들려면 `Heading 2` 옵션을 선택합니다.
  </Tab>

  <Tab title="Report and Workspace API">
    하나 이상의 HTML 요소로 이루어진 목록을 리포트의 `blocks` 속성에 지정합니다. 다음 예시는 H1, H2, 그리고 순서 없는 목록을 생성하는 방법을 보여줍니다:

    ```python theme={null}
    import wandb
    import wandb_workspaces.reports.v2 as wr

    report = wr.Report(project="report-editing")

    report.blocks = [
        wr.H1(text="How Programmatic Reports work"),
        wr.H2(text="Heading 2"),
        wr.UnorderedList(items=["Bullet 1", "Bullet 2"]),
    ]

    report.save()
    ```

    이렇게 HTML 요소가 다음과 같이 렌더링됩니다:

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/render_html.png?fit=max&auto=format&n=gsiJ_BEkjRzibnDO&q=85&s=d2eb5f1a5068971c036c21de85040025" alt="렌더링된 HTML 요소" width="1410" height="426" data-path="images/reports/render_html.png" />
    </Frame>
  </Tab>
</Tabs>

<div id="embed-rich-media-links">
  ## 리치 미디어 링크 임베드하기
</div>

트윗, 비디오, 오디오와 같은 리치 미디어를 임베드해 외부 컨텍스트로 리포트를 더욱 풍부하게 만들 수 있습니다. App UI 또는 W\&B SDK를 사용해 리포트 안에 리치 미디어를 임베드할 수 있습니다.

<Tabs>
  <Tab title="App UI">
    리포트에 URL을 복사해 붙여넣으면 리포트 안에 리치 미디어를 임베드할 수 있습니다. 아래 애니메이션은 Twitter, YouTube, SoundCloud에서 URL을 복사해 붙여넣는 방법을 보여줍니다.

    ### Twitter

    리포트 안에서 트윗을 볼 수 있도록 트윗 링크 URL을 리포트에 복사해 붙여넣습니다.

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/twitter.gif?s=6d176d431d16fbb3ee1a0b6ffe4f692f" alt="Twitter 콘텐츠 임베딩" width="810" height="760" data-path="images/reports/twitter.gif" />
    </Frame>

    ### YouTube

    리포트에 동영상을 임베드하려면 YouTube 동영상 URL 링크를 복사해 붙여넣습니다.

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/youtube.gif?s=81f20154b6601cd78026e0d362bd17a2" alt="YouTube 동영상 임베딩" width="1434" height="780" data-path="images/reports/youtube.gif" />
    </Frame>

    ### SoundCloud

    리포트에 오디오 파일을 임베드하려면 SoundCloud 링크를 복사해 붙여넣습니다.

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/soundcloud.gif?s=156f48ca41a218a67577184a23798a5a" alt="SoundCloud 오디오 임베딩" width="1018" height="684" data-path="images/reports/soundcloud.gif" />
    </Frame>
  </Tab>

  <Tab title="Report and Workspace API">
    리포트의 `blocks` 속성에 하나 이상의 임베드된 미디어 객체 목록을 전달합니다. 다음 예시는 비디오와 Twitter 미디어를 리포트에 임베드하는 방법을 보여줍니다:

    ```python theme={null}
    import wandb
    import wandb_workspaces.reports.v2 as wr

    report = wr.Report(project="report-editing")

    report.blocks = [
        wr.Video(url="https://www.youtube.com/embed/6riDJMI-Y8U"),
        wr.Twitter(
            embed_html='<blockquote class="twitter-tweet"><p lang="en" dir="ltr">The voice of an angel, truly. <a href="https://twitter.com/hashtag/MassEffect?src=hash&amp;ref_src=twsrc%5Etfw">#MassEffect</a> <a href="https://t.co/nMev97Uw7F">pic.twitter.com/nMev97Uw7F</a></p>&mdash; Mass Effect (@masseffect) <a href="https://twitter.com/masseffect/status/1428748886655569924?ref_src=twsrc%5Etfw">August 20, 2021</a></blockquote>\n'
        ),
    ]
    report.save()
    ```
  </Tab>
</Tabs>

<div id="duplicate-panel-grids">
  ## 패널 그리드 복제
</div>

동일한 리포트 또는 다른 리포트에서 패널 그리드를 복제해 레이아웃을 다시 사용할 수 있습니다. 패널 그리드를 선택해 복사하여 붙여넣기 하면 동일한 리포트에서 복제하거나 다른 리포트에 붙여넣을 수 있습니다.

오른쪽 상단의 드래그 핸들을 선택해 전체 패널 그리드 섹션을 선택합니다. 리포트에서 패널 그리드, 텍스트, 제목 등의 영역을 클릭한 뒤 드래그해 범위를 선택합니다.

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/demo_copy_and_paste_a_panel_grid_section.gif?s=5bf5b34f23454f0d3816d2c9dd9f8dc1" alt="패널 그리드 복사" width="1684" height="1226" data-path="images/reports/demo_copy_and_paste_a_panel_grid_section.gif" />
</Frame>

<div id="delete-panel-grids">
  ## 패널 그리드 삭제
</div>

리포트에서 해당 패널 그리드의 레이아웃이나 콘텐츠가 더 이상 필요하지 않으면 패널 그리드를 삭제합니다. 패널 그리드를 선택한 다음 키보드에서 `delete` 키를 눌러 패널 그리드를 삭제합니다.

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/gsiJ_BEkjRzibnDO/images/reports/delete_panel_grid.gif?s=76b4dad5968138f1f44a9b798654e3c4" alt="패널 그리드 삭제" width="1425" height="670" data-path="images/reports/delete_panel_grid.gif" />
</Frame>

<div id="collapse-headers-to-organize-reports">
  ## 헤더 접기를 통해 리포트 정리하기
</div>

리포트에서 헤더를 접어 텍스트 블록 안의 콘텐츠를 숨길 수 있습니다. 리포트가 로드되면 확장된 헤더에 포함된 콘텐츠만 표시됩니다. 리포트에서 헤더를 접으면 콘텐츠를 더 잘 정리하고 필요한 것보다 더 많은 데이터가 로드되는 것을 방지할 수 있습니다. 다음 애니메이션은 이 과정을 보여 줍니다.

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-docs-sandboxes-integrations-placement/FOC0bhajYe24DEr9/images/reports/collapse_headers.gif?s=7140fb1a97bd9efdcd0300e16fb4a701" alt="리포트에서 헤더를 접는 과정" width="1425" height="670" data-path="images/reports/collapse_headers.gif" />
</Frame>

<div id="visualize-relationships-across-multiple-dimensions">
  ## 여러 차원에 걸친 관계 시각화
</div>

하나의 차트에서 세 개 이상의 변수 간 관계를 드러내고 싶을 때는 표준 2D 플롯만으로는 한계가 있을 수 있습니다. 2D 플롯으로 보여줄 수 있는 것보다 더 많은 변수를 비교하려면 색상 그라디언트를 추가 차원으로 사용하세요. 변수 중 하나를 색상 그라디언트로 표현하면 패턴을 더 쉽게 해석할 수 있습니다.

1. 페널티 점수나 학습률처럼 색상 그라디언트로 나타낼 변수를 선택하세요. 이렇게 하면 트레이닝 시간(x축)에 따라 페널티(색상)가 보상 또는 부작용(y축)과 어떻게 상호작용하는지 더 명확하게 이해할 수 있습니다.
2. 주요 추세를 강조하세요. 특정 Runs 그룹 위에 마우스를 올려 시각화에서 해당 그룹을 강조 표시하세요.
